3

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

4

3 回答 3

5

从 keySet().iterator() 返回的迭代器应该返回一个有序集合。地图 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 的情况下,我将其解释为迭代器将返回一个有序集合。确实,LinkedHashMap API并没有明确说明这一点,但您可以尝试一下并观察您的输出。

于 2012-06-14T18:50:26.930 回答
5

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

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

于 2012-06-14T18:51:47.477 回答
1

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

有点像:

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

于 2012-06-14T18:54:42.283 回答