17

我正在与许多LinkedHashMap要么LinkedHashMap<Long, Long>LinkedHashMap<Long, Double>要么LinkedHashMap<Long, Integer>

我的目标是找到或创建一个方法,该方法将以相同的顺序List<Long>返回具有上述所有键的a 。顺序很重要,这就是为什么我认为我不能使用which is a . 此外,我还有许多其他方法只接受作为输入,因此我希望所需的方法以该对象类型返回,以便我可以继续使用这些方法。LinkedHashMap<Long,...> myMap.keySet()Set<Long>List<Long>

为例如 a 编写一个返回 this 的方法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>and之外几乎相同的方法LinkedHashMap<Long, Integer>

有什么方法可以概括我粘贴的方法以接受所有三种类型:LinkedHashMap<Long, Long>,LinkedHashMap<Long, Double>LinkedHashMap<Long, Integer>?

4

2 回答 2

24

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

Map#keySet()for 方法LinkedHashMap将按插入顺序返回集合。Map这是来自文档的引用:

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

因此,您无需为此编写单独的方法。keySet()和之类的方法entrySet()将仅返回插入顺序中的条目。


好吧,如果你真的想要一个List<Keys>,那么你可以直接这样做:

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

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

于 2013-09-21T07:00:33.940 回答
4

LinkedHashMap的一致顺序适用于键、值和条目。

你应该做的很好:

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

如果您需要更多保证,请查看. 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()),它使用链表作为迭代顺序。

于 2013-09-21T07:09:36.357 回答