Как работает расширенный оператор for для массивов и как получить итератор для массива? - PullRequest
76 голосов
/ 12 октября 2010

Учитывая следующий фрагмент кода:

int[] arr = {1, 2, 3};
for (int i : arr)
    System.out.println(i);

У меня есть следующие вопросы:

  1. Как работает вышеприведенный цикл для каждого цикла?
  2. Какполучить итератор для массива в Java?
  3. Преобразуется ли массив в список для получения итератора?

Ответы [ 13 ]

3 голосов
/ 11 января 2013

Для (2) Guava предоставляет именно то, что вы хотите, как Int.asList () . Существует эквивалент для каждого типа примитива в связанном классе, например, Booleans для boolean и т. Д.

    int[] arr={1,2,3};
    for(Integer i : Ints.asList(arr)) {
      System.out.println(i);
    }
2 голосов
/ 23 апреля 2012

Я недавно учился, но я верю, что оригинальный пример с int [] выполняет итерацию по массиву примитивов, но не с использованием объекта Iterator. Он просто имеет один и тот же (похожий) синтаксис с разным содержимым,

for (primitive_type : array) { }

for (object_type : iterableObject) { }

Arrays.asList () APPARENTLY просто применяет методы List к заданному массиву объектов, но для любого другого типа объектов, включая примитивный массив, iterator (). Next () APPARENTLY просто вручает вам ссылку на оригинал объект, рассматривая его как список с одним элементом. Можем ли мы увидеть исходный код для этого? Вы бы не предпочли исключение? Не берите в голову. Я предполагаю (это УДОБНО), что это походит (или это ЕСТЬ) на одноэлементную Коллекцию. Так что здесь asList () не имеет отношения к случаю с массивом примитивов, но сбивает с толку. Я не ЗНАЮ, что я прав, но я написал программу, которая говорит, что я.

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

// Java(TM) SE Runtime Environment (build 1.6.0_19-b04)

import java.util.*;

public class Page0434Ex00Ver07 {
public static void main(String[] args) {
    int[] ii = new int[4];
    ii[0] = 2;
    ii[1] = 3;
    ii[2] = 5;
    ii[3] = 7;

    Arrays.asList(ii);

    Iterator ai = Arrays.asList(ii).iterator();

    int[] i2 = (int[]) ai.next();

    for (int i : i2) {
        System.out.println(i);
    }

    System.out.println(Arrays.asList(12345678).iterator().next());
}
}
1 голос
/ 24 марта 2013

Мне нравится ответ с 30-го числа, используя Iterators из Гуавы. Однако из некоторых фреймворков вместо пустого массива я получаю ноль, а Iterators.forArray(array) не справляется с этим. Итак, я придумал этот вспомогательный метод, который вы можете вызвать с помощью Iterator<String> it = emptyIfNull(array);

public static <F> UnmodifiableIterator<F> emptyIfNull(F[] array) {
    if (array != null) {
        return Iterators.forArray(array);
    }
    return new UnmodifiableIterator<F>() {
        public boolean hasNext() {
            return false;
        }

        public F next() {
            return null;
        }
    };
}
...