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

2022-09-02 12:46:46

我正在与许多 , 或 .LinkedHashMapLinkedHashMap<Long, Long>LinkedHashMap<Long, Double>LinkedHashMap<Long, Integer>

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

编写一个方法来返回这个,例如,a很容易: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>


答案 1

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

的方法将按广告订单顺序返回集合。以下是地图文档中的一段话:Map#keySet()LinkedHashMap

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

因此,您不需要为此编写单独的方法。像 和 这样的方法将仅返回广告订单中的条目。keySet()entrySet()


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

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

..任何你想要一个列表。您根本不需要该方法。


答案 2

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