获取LinkedHashMap的子集并保留顺序

时间:2012-06-14 18:45:01

标签: java iterator 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(); 上面的行将从一个集合获得一个迭代器,并且没有订购。这会导致按键随机排列吗?如果是的话,过滤后我无法保留我的地图的原始订单(不保证).... 有人可以帮我吗?

3 个答案:

答案 0 :(得分:5)

从keySet()返回的迭代器.theerator()应该返回一个有序的Set。来自Map 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对此并不明确,但您可以尝试一下并观察输出。

答案 1 :(得分:5)

当您致电keySet()时,会根据基础数据创建密钥视图。不可否认,它并没有很清楚地记录下来,但由于 只是一个视图,因此以不同的顺序迭代该视图会非常奇怪。

您可以检查当然的实施情况,但我确定没问题。

答案 2 :(得分:1)

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

有点像:

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