Улучшена Java для цикла
В настоящее время (с Java 6), используя Java расширенный for-loop, я не знаю, как напрямую обращаться к индексу итератора, не возвращаясь к старому индексированному циклу или используя внешний счетчик.
Есть ли планы (или, возможно, текущий способ) реализовать этот расширенный расширенный цикл for, где можно было бы получить доступ к индексу цикла (и даже, возможно, манипулировать им)?
В качестве примера, где это может потребоваться, рассмотрите (это от фактического производственного кода):
int i = 1;
for (final String action : actions) {
parameters.set(String.valueOf(i++), action);
}
Ответы
Ответ 1
Ну, как вы сказали, если вы должны иметь индекс, просто используйте стандартный цикл for
или вручную обновите счетчик.
Но переосмыслите свой вопрос. Зачем вам нужен индекс в цикле for (Object o : list)
?
Весь смысл использования расширенного цикла - абстрагировать отвратительные части использования индекса или итератора.
Большинство языков сегодня не предоставляют такую функциональность в циклах. Как пример, способ Pythonic для этого:
for index, val in enumerate(someList):
# ....
Ответ 2
Нет. Используйте внешнюю переменную.
Ответ 3
Зачем им нужно предоставить еще один способ доступа к элементам по индексу?
Улучшенный цикл for был создан как ярлык для того, когда вам не нужен индекс элемента. Это упростило ситуацию.
Если вам все еще нужен индекс, вернитесь к регулярному циклу. Это одна из причин, по которым они там.
Ответ 4
Лучше держать внешний счетчик, чтобы получить индекс, но вы могли бы сделать что-то вроде этого (это бит избытка для простой задачи):
class Enum<T> implements Iterable<Indexer<T>> {
private int indx;
private Iterator<T> itr;
private Indexer<T> indxr = new Indexer<T>();
private Enum(Iterable<T> iter) {
this.itr = iter.iterator();
}
public static <T> Enum<T> iterate(Iterable<T> iter) {
return new Enum<T>(iter);
}
@Override
public Iterator<Indexer<T>> iterator() {
return new AbstractIterator<Indexer<T>>() {
@Override
protected Indexer<T> computeNext() {
if (itr.hasNext()) {
indxr.index = indx++;
indxr.val = itr.next();
return indxr;
}
return endOfData();
}
};
}
}
class Indexer<T> {
public int index;
public T val;
@Override
public String toString() {
return String.format("[ %d : %s ]", index, val);
}
Для получения индекса во время итерации:
List<Integer> list = new ArrayList<Integer>() ;
list.addAll(Arrays.asList(1, 2, 3, 4, 5,6,55,23,12,24,16));
for (Indexer<Integer> en : Enum.iterate(list))
System.out.println(en.index+" "+en.val);
Примечание: приведенный выше код имеет зависимость от Guava AbstractIterator
Ответ 5
Сейчас нет способа, если вы не держите счетчик! Я знаю, что это уродливо, но java 7 будет лучше. Я не знаю, почему другие люди говорят, что нам это не нужно. Иногда нам нужно знать, что такое последний элемент, или нечетный член и т.д.