Как получить коллекцию итератора в Java? - PullRequest
1 голос
/ 07 августа 2011

Часто возникает необходимость настроить ArrayList<>.Один из конструкторов принимает коллекцию, но нет конструктора, который принимает итератор.

Что если у меня есть итератор?Есть ли способ «достучаться» до коллекции, которая предлагает итератор, чтобы использовать конструктор ArrayList<>?
В частности, у меня есть итератор, предлагаемый PropertiesConfiguration.getKeys(), который является частью org.apache.Обще .

Ответы [ 3 ]

11 голосов
/ 07 августа 2011

Нет такой вещи, и Iterator х Collection.Итератор может быть создан независимо от Collection.Он может быть получен из любого Iterable, или вы даже можете создать класс, реализующий итератор.

Однако вы можете получить ArrayList из Iterator, перебирая его и добавляя его элементы по одномуone:

Iterator<X> it = ...;
List<X> list = new ArrayList<X>();
while (it.hasNext()) {
  list.add(it.next());
}

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

Я бы посоветовал вам взглянуть на Google Guava , служебную библиотеку от Google.У него есть класс Lists, который позволяет вам выполнять следующие действия:

Iterator<X> it = ...;
List<X> list = Lists.newArrayList(it);

В библиотеке имеется множество методов, чрезвычайно полезных для повседневного кодирования Java.Он содержит в основном все, что вы хотите, но не можете найти в стандартном API Java 6.

1 голос
/ 07 августа 2011

Не существует действительно общего способа сделать это, потому что в Java Iterator - это просто интерфейс с тремя методами: next, hasNext и remove.

Когда вы получаете итератор, вы используете фабричный метод, который дает вам экземпляр некоторого класса, реализующего интерфейс.Если вы знаете конкретный класс, вы можете взглянуть на его документацию или источник, чтобы узнать, есть ли способ найти коллекцию, для которой он повторяется.

Но таких классов много.В случае ArrayList посмотрите в исходном коде, какой тип итератора вы получаете.

EDIT :

Вот исходный код для ArrayList в Open JDK 7: http://www.docjar.com/html/api/java/util/ArrayList.java.html

Итератор над ArrayList является экземпляром частного внутреннего класса Itr.Это не должно быть слишком удивительно.В конце концов, итератор происходит от фабричного метода, так что вы действительно не должны знать, какой тип итератора вы получаете.Фактически, если бы вы смогли получить класс этого экземпляра и получить доступ к его методам (скажем, с помощью отражения), вы бы поступили плохо.Этот итератор является частью (внутренней) реализации класса ArrayList и (как указывает @merryprankster) может измениться в будущем.

0 голосов
/ 07 августа 2011

Я не знаю, возможно ли это, но, по моему мнению, такой функции не должно быть, потому что итератор может не входить в коллекцию.Например, можно создать итератор, который объединяет несколько коллекций!

...