20

我有一个列表,我将其转换为地图来做一些工作。之后,我再次将地图转换回列表,但这次顺序是随机的。我需要在我的第二个列表中保留相同的初始订单。

显而易见的原因是 HashMap 不保持顺序。但我需要做一些事情才能做到这一点。我无法更改地图实现。我该怎么做?

考虑给定的代码:

import java.util.*;
public class Dummy {

public static void main(String[] args) {
    System.out.println("Hello world !");
    List<String> list = new ArrayList<String>();
    list.add("A");list.add("B");list.add("C");
    list.add("D");list.add("E");list.add("F");

    Map<String,String> map = new HashMap<String, String>();

    for(int i=0;i<list.size();i=i+2)
        map.put(list.get(i),list.get(i+1));

    // Use map here to do some work

    List<String> l= new ArrayList<String>();
    for (Map.Entry e : map.entrySet()) {
        l.add((String) e.getKey());
        l.add((String) e.getValue());
    }
  }
}

例如 - 最初,当我打印列表元素时,它打印出来

A B C D E F 

现在,当我打印 的元素时List l,它打印出

E F A B C D
4

7 回答 7

45

HashMap本身不维护插入顺序 - 但LinkedHashMap确实如此,因此请改用它。

据记载... HashMap

此类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

并且LinkedHashMap

Map 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。

于 2013-10-03T16:45:02.583 回答
7

使用LinkedHashMap而不是 HashMap 来维护秩序。

Map<String,String> map = new LinkedHashMap<String, String>();
于 2013-10-03T16:46:17.663 回答
2

为什么你不能改变Map实现(LinkedHashMap例如)?

如果有逻辑排序,您可以使用自定义对 List 进行排序Comparator

于 2013-10-03T16:45:29.470 回答
1

HashMap不保留插入顺序

Map 接口的基于哈希表的实现。此实现提供所有可选的映射操作,并允许空值和空键。(HashMap 类大致相当于 Hashtable,除了它是不同步的并且允许空值。)这个类不保证映射的顺序;特别是,它不保证订单会随着时间的推移保持不变。

LinkedHashMap如果要保留键的顺序,请使用

于 2013-10-03T16:45:10.543 回答
0

如果您确实无法切换到另一个Map实现(LinkedHashMap正是您想要的),那么唯一的另一种可能性是保留原始List,并使用它ListMap.

public <T> List<T> listFromMapInOrder(final Map<T, T> map, final List<T> order) {
    List<T> result = new ArrayList<T>();
    for (T key : order) {
        if (map.containsKey(key)) {
            result.add(key);
            result.add(map.get(key));
        }
    }
    return result;
}

但我会重构代码,直到可以切换到LinkedHashMap.

于 2013-10-03T17:09:15.477 回答
0

考虑让您的物品可分类。在字符串的情况下,已经存在自然排序;按字母顺序排列。您可以制作使用 sortable 类的对象,因此您可以使用排序算法将这些对象按照良好的顺序排列,无论您从哈希中获取它们的顺序是什么!

于 2013-10-03T16:46:59.307 回答
0

现在是 a 的时候了LinkedHashMap,它完全是为了保留插入顺序。

请注意,即使是TreeMap存在的,它也允许您通过使用 Comparable 接口来保持所需的顺序。它不再是哈希映射,而是一棵树。

于 2013-10-03T16:47:11.130 回答