Подтвердить что ты не робот

Получить перечисление (для ключей) карты (HashMap) в Java?

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

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

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

4b9b3361

Ответ 1

Коллекции коллекций Apache имеют адаптер, который делает Iterator доступным для использования как Enumeration. Посмотрите IteratorEnumeration.

Адаптер для создания экземпляра Iterator представляется экземпляром Enumeration

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

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

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

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

Ответ 2

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

В API-документе перечисления метода есть следующее:

<я > public static Enumeration enumeration (Коллекция 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());
 }

, и результат:
один
два
три

Ответ 3

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

    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();
        }

    }

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