维护HashMap中的顺序

One*_*ror 17 java

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

显而易见的原因是HashMap没有维护顺序.但我需要做一些事情才能做到.我无法更改Map实现.我该怎么做?

考虑给定的代码:

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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于ex - 最初,当我打印列表元素时,它打印出来

A B C D E F 
Run Code Online (Sandbox Code Playgroud)

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

E F A B C D
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 35

HashMap本身不维护插入顺序 - 但LinkedHashMap确实如此,所以请使用它.

记录...... HashMap:

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

而且LinkedHashMap:

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

  • 您无法更改实现是没有意义的。在这些其他地方,他们实际上创建了一个 HashMap,还是只接受一个作为参数?您应该针对接口而不是实现进行编程。将它们更改为采用 Map 作为参数而不是 HashMap,然后您可以随意替换实现。 (2认同)

DT7*_*DT7 6

使用LinkedHashMap而不是HashMap来维护顺序.

Map<String,String> map = new LinkedHashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)