2013-06-09 2 views
1

Я хотел бы использовать следующий класс следующим образом:Как я могу получить итератор массива?

for(String device : new Devices()) 
{ 
    // 
} 

Если я обеспечить прямой доступ к внутреннему массиву строк, то нет никаких проблем:

for(String device : new Devices().getAllDevices()) //getAllDevices would be a String[] 
{ 
    // 
} 

Но я просто хочу переместите итератор, который был бы простым, если AllDevices были ArrayList.

public final class Devices implements Iterable<String>{ 

    private static final String MyKindleFire = "123156448975312"; 

    private static final String[] AllDevices = new String[]{MyKindleFire}; 

    @Override 
    public Iterator<String> iterator() { 
     // if AllDevices were an array list, this would be possible 
     // but how should I do this for an array? 
     return AllDevices.iterator(); 
    } 
} 

Это работает, но я хотел бы знать, лучший способ, если это возможно:

@Override 
public Iterator<String> iterator() { 
    return Arrays.asList(AllDevices).iterator(); 
} 

ответ

4

К сожалению, вы не можете сделать это без преобразования вашего массива List<T>: итерация массивы с «Еогеасп «версия цикла for - это« трюк компилятора », то есть то, что компилятор знает и делает внутри.

Способность использовать примитивы в петлях «foreach» является косвенным признаком того, что Iterator<T> там не используется, поскольку дженерики Java не могут использоваться с примитивными типами.

+0

Это отличная мысль о примитивах, я об этом не думал. – weston

+2

Более прямое «указание» [:-)] - это JLS 14.14.2 - http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2 - который точно определяет, что улучшенное для цикла средство для массивов. –

3
String[] someArray = ....; 
List<String> someList = java.util.Arrays.asList(someArray); 
someList.iterator(); 

Я думаю, что это единственный способ получить итератор массива в чистом Java ,

Если вы используете Apache Commons-коллекции вы можете просто использовать:

org.apache.commons.collections.IteratorUtils.arrayIterator(Object[]) 

См http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections/IteratorUtils.html

2

Вы можете использовать Guava's Iterators.forArray(T...), чтобы сделать итератор.

В качестве альтернативы сделайте Iterable из вашего массива (например, с помощью Arrays.asList(T...)) и верните его .iterator().

+0

Да, я вижу, что несколько библиотек делают это, это интересно, потому что даже приходит комментарий, что «Arrays.asList» предпочтительнее. Примечание. Часто бывает предпочтительнее представлять ваши данные с использованием типа коллекции, например, с помощью 'Arrays.asList (Object [])', что делает этот метод ненужным ». – weston

Смежные вопросы