从LinkedHashMap中提取所有键到列表的方法

19

我正在使用许多LinkedHashMap,它们可能是LinkedHashMap<Long, Long>LinkedHashMap<Long, Double>LinkedHashMap<Long, Integer>

我的目标是查找或创建一个方法,以在相同顺序中返回上述LinkedHashMap<Long,...>中的所有键的List<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
return new ArrayList<Long>(target.keySet()); - newuser
2个回答

26

由于顺序很重要,所以我不认为可以使用 myMap.keySet(),因为它返回的是一个 Set。

LinkedHashMapMap#keySet() 方法将按照插入顺序返回其集合中的键。这里引用了来自Map 文档的一句话:

映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。某些映射实现(例如 TreeMap 类)对其顺序提供了特定的保证;其他实现(例如 HashMap 类)则不提供。

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


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

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

无论您想在哪里使用列表,都不需要使用该方法。


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()),该方法使用链接列表来确定迭代顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接