Java улучшено для цикла - PullRequest
       3

Java улучшено для цикла

12 голосов
/ 30 ноября 2010

В настоящее время (начиная с Java 6), используя расширенный цикл for Java, я не знаю никакого способа прямого доступа к индексу итератора, кроме возврата к старому индексированному циклу for или использования внешнего счетчика.

Есть ли планы (или, возможно, текущий способ) реализовать этот «расширенный расширенный» цикл for, где можно было бы получить доступ к индексу цикла (и даже возможно манипулировать им)?

Какпример, где это может понадобиться, рассмотрим (это из фактического производственного кода):

int i = 1;
for (final String action : actions) {
  parameters.set(String.valueOf(i++), action);
}

Ответы [ 5 ]

15 голосов
/ 30 ноября 2010

Ну, как вы сказали, если у вас должен быть индекс, просто используйте стандартный цикл for или обновите счетчик вручную.

Но переосмыслите свой вопрос. Зачем вам нужен индекс в цикле for (Object o : list)?

Весь смысл использования расширенного цикла состоит в том, чтобы абстрагироваться от неприятных частей использования индекса или итератора.

Большинство современных языков не предоставляют такую ​​функциональность в циклах. Как пример, Pythonic способ сделать это:

for index, val in enumerate(someList):
    # ....
7 голосов
/ 30 ноября 2010

Нет. Используйте внешнюю переменную.

6 голосов
/ 30 ноября 2010

Зачем им нужно предоставлять еще один способ доступа к элементам по индексу?

Расширенный цикл for был создан как ярлык для случая, когда вам не нужен индекс элемента.Это упростило вещи.

Если вам все еще нужен индекс, вернитесь к обычному циклу for.Это одна из причин, почему они там.

2 голосов
/ 30 ноября 2010

Лучше иметь внешний счетчик, чтобы получить индекс, но вы можете сделать что-то вроде этого (это немного излишне для простой задачи) :

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's AbstractIterator

1 голос
/ 30 ноября 2010

Прямо сейчас нет пути, если вы не держите счетчик! Я знаю, что это ужасно, но Java 7 будет лучше. Я не знаю, почему другие люди говорят, что нам это не нужно. Иногда нам нужно знать, кто является последним или нечетным членом и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...