获取LinkedHashMap的子集并保留顺序

3
与HashMap不同,LinkedHashMap保持顺序。而这个顺序是插入顺序。
假设我有一个LinkedHashMap,如下所示(从上到下排序,左侧是键,右侧是值):
1:“One” 2:“Two” 3:“Three” 4:“Four”
然后我有一个包含(3,1)的键列表。
我想要做的是按顺序遍历LinkedHashMap并挑选出其键在列表中的条目。
所以我想要的结果是(1仍然在3之前,因为那是过滤之前的顺序):
1:“One” 3:“Three”
以下是我的代码:
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个回答

5
当您调用keySet()时,它会基于基础数据创建一个键的视图。不可否认,这并没有非常清楚地记录下来,但由于它只是一个视图,如果该视图按不同的顺序进行迭代,那将极为奇怪。
当然,您可以检查其实现,但我确定它很好。

5
从keySet().iterator()返回的迭代器应该返回一个有序集合。来自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

你试过了吗?我不确定它是否按照插入的顺序返回它们,但在这种特殊情况下,你可以使用获取的KeySet创建一个TreeSet,因为它们是整数,所以自然排序是1然后是3。

就像这样:

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


我尝试过并且它可以工作,但是我不确定它是否保证...你的代码将在我所做的示例中工作。但是如果我真的想保持插入顺序,它就不会起作用...例如,如果我插入像3、1、2、4这样的条目,并且想要得到3、2。自然顺序将不起作用。但似乎其他人认为它是有保证的。 - ZZZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接