2013-09-21 2 views
9

Я работаю со многими LinkedHashMap, которые либо LinkedHashMap<Long, Long>, LinkedHashMap<Long, Double>, либо LinkedHashMap<Long, Integer>.Способ извлечения всех ключей из LinkedHashMap в список

Моя цель состоит в том, чтобы найти или создать метод, который будет возвращать List<Long> со всеми ключами в вышеприведенном LinkedHashMap<Long,...>в том же порядке. Заказ очень важен, поэтому я не думаю, что могу использовать myMap.keySet(), который является Set<Long>. Кроме того, у меня есть много других методов, которые принимают только List<Long> в качестве ввода, поэтому я хотел бы, чтобы желаемый метод возвращался в этот тип объекта, поэтому я могу продолжать использовать эти методы.

Дать способ вернуть это для, например, LinkedHashMap<Long, Long> достаточно легко:

private static List<Long> getLongKeys(LinkedHashMap<Long, Long> target) { 
    List<Long> keys = new ArrayList<Long>(); 

    for(Map.Entry<Long, Long> t : target.entrySet()) { 
     keys.add(t.getKey()); 
    } 
    return keys; 
} 

Однако, то мне нужно писать почти идентичные методы LinkedHashMap<Long, Double> и LinkedHashMap<Long, Integer> кроме.

Можно ли каким-либо образом обобщить метод, который я вставил, чтобы принять все три типа: LinkedHashMap<Long, Long>, LinkedHashMap<Long, Double> или LinkedHashMap<Long, Integer>?

+2

новый ArrayList (target.keySet()); – newuser

ответ

13

Упорядочение важно, поэтому я не думаю, что я могу использовать myMap.keySet(), который представляет собой набор

Метод Map#keySet() для LinkedHashMap возвращает набор в порядке вставки. Вот цитата из Map документации:

Порядка карты определяются как порядок, в котором итераторы на виде коллекционную карты Возвратятся их элементы. Некоторые реализации карт, такие как класс TreeMap, предоставляют конкретные гарантии в отношении их порядка; другие, как и класс HashMap, нет.

Для этого вам не нужно писать отдельный метод. Такие методы, как keySet() и entrySet(), возвращают записи только в порядке вставки.


Ну, если вы действительно хотите List<Keys>, то вы можете сразу сделать:

List<Long> keys = new ArrayList<>(target.keySet()); 

.. где вы хотите списка. Вам вообще не нужен этот метод.

+0

@ пользователь2763361. Обновлено. –

3

LinkedHashMap Согласованный порядок применяется к ключам, значениям и вводам.

Вы должны быть очень хорошо делание:

ArrayList<Long> keys = new ArrayList<>(target.keySet()); 

Если вам нужно больше уверенности, посмотрите на source code для LinkedHashMap. Важная часть:

private class KeyIterator extends LinkedHashIterator<K> { 
    public K next() { return nextEntry().getKey(); } 
} 

private class ValueIterator extends LinkedHashIterator<V> { 
    public V next() { return nextEntry().value; } 
} 

private class EntryIterator extends LinkedHashIterator<Map.Entry<K,V>> { 
    public Map.Entry<K,V> next() { return nextEntry(); } 
} 

// These Overrides alter the behavior of superclass view iterator() methods 
Iterator<K> newKeyIterator() { return new KeyIterator(); } 
Iterator<V> newValueIterator() { return new ValueIterator(); } 
Iterator<Map.Entry<K,V>> newEntryIterator() { return new EntryIterator(); } 

Так итераторы для ключей, значений и записи все из того же источника (nextEntry()), который использует связанный список для итерации порядка.

+0

Javadoc - лучшая ссылка, чем исходный код. – assylias

Смежные вопросы