获取 LinkedHashMap 的子集并保留顺序


与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 itr = linkedHashMap.keySet().iterator();上面的行将从集合中获取迭代器,并且集合不排序。那么这会导致密钥按随机顺序排列吗?如果是,过滤后我无法保持地图的原始顺序(不保证)。有人可以帮助我吗?

从 keySet().iterator() 返回的迭代器应该返回一个有序的 Set。来自地图 API 的文档:

The Map interface provides three collection views, which allow a map's contents to be 
viewed as a set of keys, collection of values, or set of key-value mappings. The order of 
a map is defined as the order in which the iterators on the map's collection views return   
their elements. Some map implementations, like the TreeMap class, make specific guarantees  
as to their order; others, like the HashMap class, do not.

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

当您调用 keySet() 时,这将基于基础数据创建键的视图。诚然,它没有非常清楚地记录下来,但由于它只是一个视图,因此以不同的顺序迭代该视图将非常奇怪。

当然,您可以检查实现,但我相信这很好。

你试过吗?我不确定它是否以与插入它们相同的顺序返回它们,但在这种特殊情况下,您可以使用获得的 KeySet 创建一个 TreeSet,因为它们是整数,因此它将是自然顺序。1 然后是 3。

有点像:

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

最新更新