Java: перечисление из набора <String> - PullRequest
47 голосов
/ 17 августа 2011

У меня простой вопрос о коллекциях. У меня есть Set<String> объект. Я хочу перечисление строк в этом наборе. Какой самый чистый / лучший способ сделать это?

Ответы [ 3 ]

193 голосов
/ 19 августа 2011

java.util.Collections.enumeration(set)

Javadoc

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

27 голосов
/ 17 августа 2011

РЕДАКТИРОВАТЬ: Нет необходимости писать свой собственный (хотя я оставлю реализацию ниже для потомков) - см. Ответ Кевина Бурриллиона за тот, что в 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());
    }
}
5 голосов
/ 17 августа 2011

Предполагая, что вы имеете в виду перечисление в математическом смысле, самый простой способ сделать это - использовать цикл for, применимый к любому классу, который реализует Iterable:

Set<String> strs = ...

for (String s : strs) {
 ...
}

Если вам действительно требуется Enumeration, вы можете реализовать класс адаптера для переноса Iterator, возвращаемого путем вызова iterator(). В библиотеке коллекций Apache есть класс адаптера: IteratorEnumeration.

Или вы можете использовать библиотеку Google Guava:

Set<String> mySet = ...
Enumeration<String> = Iterators.asEnumeration(mySet.iterator());
...