54

I have a simple collections question. I have a Set<String> object. I want an Enumeration<String> of the Strings in that Set. I need an Enumeration<String> since I am overriding a method that specifically returns an Enumeration<String>. What is the cleanest/best way to go about it?

Nathan
  • 8,093
  • 8
  • 50
  • 76
well actually
  • 11,810
  • 19
  • 52
  • 70

3 Answers3

204

java.util.Collections.enumeration(set)

Javadoc

Returns an enumeration over the specified collection. This provides interoperability with legacy APIs that require an enumeration as input.

Snekse
  • 15,474
  • 10
  • 62
  • 77
Kevin Bourrillion
  • 40,336
  • 12
  • 74
  • 87
26

EDIT: There's no need to write your own (although I'll leave the implementation below for posterity) - see Kevin Bourrillion's answer for the one in the JDK.


If you really need an enumeration, could could use:

Enumeration<String> x = new Vector(set).elements();

It would be better to use Iterable<E> if at all possible though...

A better alternative is to write a small wrapper class around Iterator<E>. That way you don't have to take a copy just to find an imlementation of 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());
    }
}
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • 1
    I just down voted as well. No need to write your own implementation when the JDK has a static util method that does it for you as pointed out by Kevin Bourrillion. – Snekse Aug 29 '11 at 16:38
  • 3
    @Snekse: If the previous downvoter had said as much, that would have been helpful. I can't delete my answer now as it's the accepted one, but I can point out Kevin's... – Jon Skeet Aug 29 '11 at 20:18
  • 1
    Your answer wasn't bad, there was just a better one available after the fact. There should be a SO badge for having an accepted answer with negative vote totals (currently sitting at negative one) :-) – Snekse Aug 30 '11 at 16:06
  • 3
    @Snekse: I have no problem with being downvoted due to the fact that it's already in the JDK. I just object to a downvote without a comment... – Jon Skeet Aug 30 '11 at 16:09
  • 1
    @Charlotte: If you could unaccept this answer (and ideally accept Kevin's) it would allow me to delete this one. Kevin's is a much better answer than mine, but I can't delete mine while you've left it accepted. – Jon Skeet Sep 02 '11 at 21:59
  • It's a pity there's not an option to remove acceptance of an answer by the answer author, without resorting to deleting the answer, I see this a lot on SO. – Adrian Baker Feb 11 '21 at 02:58
4

Assuming you mean enumeration in the mathematical sense the cleanest way to do this is via a for-loop, applicable to any class that implements Iterable:

Set<String> strs = ...

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

If you really require an Enumeration you could implement an adapter class to wrap the Iterator returned by calling iterator(). There is an adapter class in the Apache Collections library: IteratorEnumeration.

Or you could use Google's Guava library:

Set<String> mySet = ...
Enumeration<String> = Iterators.asEnumeration(mySet.iterator());
Adamski
  • 54,009
  • 15
  • 113
  • 152