Получить перечисление (для ключей) карты (HashMap) в Java?
Насколько я понимаю, кажется, что нет прямого способа получить Enumeration
непосредственно для ключей HashMap
. Я могу получить только keySet()
. Из этого Set
я могу получить Iterator
, но Iterator
кажется чем-то отличным от Enumeration
.
Каков наилучший и наиболее эффективный способ напрямую получить Enumeration
из Ключей a HashMap
?
Фон: Я реализую свой собственный ResourceBundle (= > getKeys()
Method), и я должен предоставить/реализовать метод который возвращает Перечисление всех ключей. Но моя реализация основана на HashMap
, поэтому мне нужно как-то выяснить, как наилучшим образом преобразовать между этими двумя методами "Итератор/Перечислитель".
Ответы
Ответ 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();
}
}
И затем вы можете использовать это пользовательское перечисление:)