获取 LinkedHashMap 的子集并保留顺序

问题描述 投票:0回答:4

HashMap
不同,
LinkedHashMap
中的顺序很重要。这里的顺序是插入顺序。

假设我有一个如下所示的

LinkedHashMap
(从上到下排序,左侧部分是关键,右侧部分是值):

1:“一”
2:“二”
3:“三”
4:“四”

然后我有一个键列表,其中包含,比方说,

(3,1)

我想要做的是按顺序循环遍历

LinkedHashMap
并挑选出其键在列表中的条目。

所以我想要的结果是(1仍然在3之前,因为这是过滤之前的顺序):

1:“一”
3:“三”

这是我的代码:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class SelectCertainEntriesFromLinkedHashMap {
    public static void main(String args[]) {
        Map<Integer,String> linkedHashMap = new LinkedHashMap<Integer,String>();
        linkedHashMap.put(1, "One");
        linkedHashMap.put(2, "Twe");
        linkedHashMap.put(3, "Three");
        linkedHashMap.put(4, "Four");
        
        List<Integer> list = new ArrayList<Integer>();
        list.add(3);
        list.add(1);
        
        Map<Integer,String> selectedlinkedHashMap = new LinkedHashMap<Integer,String>();
        
        //will this iterator iterate the keys in the order of the map (1, 2, 3, 4)? Or just random order?
        Iterator<Integer> itr = linkedHashMap.keySet().iterator();
        while(itr.hasNext()) {
            Integer key = itr.next();
            if (list.contains(key)) {
                selectedlinkedHashMap.put(key, linkedHashMap.get(key));
                System.out.println(key + ":" + linkedHashMap.get(key));
            }
        }
    
}

上面的代码返回了我喜欢的结果。但我不确定是否有保证。

1:“一”
3:“三”

问题是:

Iterator<Integer> itr = linkedHashMap.keySet().iterator();

上面的行将从集合中获取一个迭代器,并且

Set
是无序的。那么这会导致密钥的顺序随机吗?如果是,我无法在过滤后保留地图的原始顺序(不保证)......

有人可以帮我吗?

java dictionary iterator linkedhashmap
4个回答
5
投票

keySet().iterator()
返回的迭代器应该返回有序的
Set
。来自
Map
API
的文档:

Map
界面提供了三个集合视图,允许将地图的内容 被视为一组键、值的集合或一组键值映射。的顺序 映射被定义为映射集合视图上的迭代器返回的顺序 他们的元素。一些映射实现,例如
TreeMap
类,做出了特定的保证 至于他们的顺序;其他人,例如
HashMap
类,则不这样做。

因此,在

LinkedHashMap
的情况下,我将其解释为迭代器将返回有序的
Set
。确实,
LinkedHashMap
API
对此并不明确,但您可以尝试一下并观察您的输出。


5
投票

当您调用

keySet()
时,会根据底层数据创建键的视图。诚然,它的记录不是很清楚,但由于它只是一个视图,因此以不同的顺序迭代该视图将是非常奇怪的。 你当然可以检查实现,但我确信它没问题。


1
投票

有点像:

Set<Integer> set = new TreeSet<Integer>(linkedHashMap.keySet());

    


1
投票

keySet类中的

LinkedHashMap
方法的
Java 21
文档对于顺序更加明确:

视图中键的遇到顺序与该映射的映射的遇到顺序相匹配。

因此,从 Java 21 开始,答案已明确记录,是的,

linkedHashMap.keySet().iterator()
将以与地图元素相同的顺序返回键。

Java 的早期版本确实具有相同的行为,但相关文档不太明确。

因此,无论 Java 版本如何,都可以依赖

keySet
迭代顺序以与
LinkedHashMap
条目相同的顺序返回元素。

© www.soinside.com 2019 - 2024. All rights reserved.