将LinkedHashMap中的所有键提取到List中的方法

时间:2013-09-21 06:56:51

标签: java map hashmap key linkedhashmap

我正在使用LinkedHashMapLinkedHashMap<Long, Long>LinkedHashMap<Long, Double>的许多LinkedHashMap<Long, Integer>

我的目标是找到或创建一个方法,该方法将返回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 个答案:

答案 0 :(得分:18)

  

顺序很重要,这就是为什么我认为我不能使用myMap.keySet()这是一个集合

Map#keySet()的{​​{1}}方法将按插入顺序返回该集合。以下是Map文档的引用:

  

映射的顺序定义为地图集合视图上的迭代器返回其元素的顺序。一些地图实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他人,比如HashMap类,不会。

因此,您不需要为此编写单独的方法。像LinkedHashMapkeySet()这样的方法只会返回插入顺序中的条目。


好吧,如果你真的想要entrySet(),那么你可以直接做:

List<Keys>

..无论你想要一个List。你根本不需要这个方法。

答案 1 :(得分:4)

LinkedHashMap的一致排序适用于键,值和条目。

你应该做得很好:

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

如果您需要更多保证,请查看LinkedHashMap的{​​{3}}。重要的部分:

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())。