Получить перечисление (для ключей) карты (HashMap) в Java? - PullRequest
20 голосов
/ 12 января 2010

Насколько я понимаю, кажется, что нет прямого способа получить Enumeration непосредственно для Ключей HashMap. Я могу получить только keySet(). Из этого Set я могу получить Iterator, но Iterator кажется чем-то отличным от Enumeration.

Каков наилучший и наиболее эффективный способ прямого получения Enumeration от Ключей HashMap?

Справочная информация: я реализую свой собственный ResourceBundle (=> getKeys() метод), и мне нужно предоставить / реализовать метод, который возвращает перечисление всех ключей. Но моя реализация основана на HashMap, поэтому мне нужно каким-то образом выяснить, как лучше всего конвертировать между этими двумя методами "Iterator / Enumerator".

Ответы [ 3 ]

41 голосов
/ 12 января 2010

Я думаю, вы можете использовать метод перечисление из java.util.Collections класса для достижения того, что вы хотите.

Документ API метода enumerate содержит следующее:

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

Например, приведенный ниже фрагмент кода получает экземпляр Enumeration из набора ключей HashMap

 final Map <String,Integer> test = new HashMap<String,Integer>();
 test.put("one",1);
 test.put("two",2);
 test.put("three",3);
 final Enumeration<String> strEnum = Collections.enumeration(test.keySet());
 while(strEnum.hasMoreElements()) {
     System.out.println(strEnum.nextElement());
 }

и в результате получается:
один
два
три

21 голосов
/ 12 января 2010

Apache commons-collection имеет адаптер, который делает Iterator доступным для использования подобно Enumeration. Взгляните на IteratorEnumeration .

Адаптер для отображения экземпляра Итератора как экземпляра Перечисления

Короче говоря, вы делаете следующее:

Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator());

В качестве альтернативы, если вы (по какой-то причине) не хотите включать в коллекцию commons, вы можете реализовать этот адаптер самостоятельно. Это просто - просто сделайте реализацию Enumeration, передайте Iterator в конструктор, и всякий раз, когда hasMoreElements() и nextElement() вызываются, вы вызываете hasNext() и next() в базовом Iterator .

Используйте это, если вы вынуждены использовать Enumeration по какому-либо контракту API (как я полагаю, так). В противном случае используйте Iterator - это рекомендуемый вариант.

0 голосов
/ 02 сентября 2014

Вы можете написать адаптер для адаптации к перечислению.

    public class MyEnumeration implements Enumeration {

        private Iterator iterator;

        public MyEnumeration(Iterator iterator){
            this.iterator = iterator;
        }


        public MyEnumeration(Map map) {
            iterator = map.keySet().iterator();
        }


        @Override
        public boolean hasMoreElements() {
            return iterator.hasNext();
        }


        @Override
        public Object nextElement() {
            return iterator.next();
        }

    }

И тогда вы можете использовать это пользовательское перечисление:)

...