У меня вопрос простой коллекции. У меня есть объект Set<String>
. Я хочу перечисление строк в этом наборе. Каков самый чистый/лучший способ сделать это?
Java: перечисление из Set <String>
Ответ 1
РЕДАКТИРОВАТЬ: Нет необходимости писать свои собственные (хотя я оставлю реализацию ниже для потомков) - см. Kevin Bourrillion ответ на вопрос в JDK.
Если вам действительно нужно перечисление, он мог бы использовать:
Enumeration<String> x = new Vector(set).elements();
Лучше использовать Iterable<E>
, если это вообще возможно, хотя...
Лучшей альтернативой является создание небольшого класса оболочки вокруг Iterator<E>
. Таким образом, вам не нужно брать копию, чтобы найти элемент Enumeration<E>
:
import java.util.*;
class IteratorEnumeration<E> implements Enumeration<E>
{
private final Iterator<E> iterator;
public IteratorEnumeration(Iterator<E> iterator)
{
this.iterator = iterator;
}
public E nextElement() {
return iterator.next();
}
public boolean hasMoreElements() {
return iterator.hasNext();
}
}
public class Test {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
Enumeration<String> x = new IteratorEnumeration<String>(set.iterator());
}
}
Ответ 2
java.util.Collections.enumeration(set)
Javadoc
Возвращает перечисление по указанной коллекции. Это обеспечивает совместимость с устаревшими API, для которых требуется перечисление как вход.
Ответ 3
Предполагая, что вы имеете в виду перечисление в математическом смысле, самый чистый способ сделать это - через цикл, применимый к любому классу, который реализует Iterable
:
Set<String> strs = ...
for (String s : strs) {
...
}
Если вам действительно нужен Enumeration
, вы можете реализовать класс адаптера для переноса возвращаемого Iterator
путем вызова iterator()
. В библиотеке Apache Collections есть класс адаптера: IteratorEnumeration
.
Или вы можете использовать библиотеку Google Guava:
Set<String> mySet = ...
Enumeration<String> = Iterators.asEnumeration(mySet.iterator());