【问题标题】:Method to extract all keys from LinkedHashMap into a List将 LinkedHashMap 中的所有键提取到列表中的方法
【发布时间】:2013-09-26 14:44:23
【问题描述】:

我正在与许多LinkedHashMap 合作,这些LinkedHashMap<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&lt;Long, Double&gt;LinkedHashMap&lt;Long, Integer&gt; 之外,我需要编写几乎相同的方法。

有什么方法可以概括我粘贴的方法以接受所有三种类型:LinkedHashMap&lt;Long, Long&gt;LinkedHashMap&lt;Long, Double&gt;LinkedHashMap&lt;Long, Integer&gt;

【问题讨论】:

  • new ArrayList(target.keySet());

标签: java map hashmap key linkedhashmap


【解决方案1】:

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

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

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

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


好吧,如果你真的想要List&lt;Keys&gt;,那么你可以直接这样做:

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

.. 任何你想要一个列表的地方。你根本不需要这个方法。

【讨论】:

  • @user2763361。已更新。
【解决方案2】:

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

你应该做得很好:

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

如果您需要更多保证,请查看source codeLinkedHashMap。重要的部分:

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()),它使用链表进行迭代顺序。

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多