我写了一个使用Hashmap的小型java程序。程序提示输入3个员工姓名及其工资。输入3名员工后,我只想在控制台中输出地图键和值。但是,我观察到输出的排序方式与我输入的方式不同。
示例输入
输入员工姓名1:>达拉
输入Dara的工资:> 200
输入员工姓名2:>洛根
输入Logan的工资:> 300
输入员工姓名3:>艾格尼丝
输入Logan的工资:> 300
输出如下:
Agnes> 300.0
Logan> 300.0
Dara> 200.0
观察Dara现在位于底部,Agnes位于顶部。它应该是我输入它的另一种方式。请参阅下面的代码。
公共类地图{
static String name = "";
static double salary = 0;
static Scanner sc = new Scanner(System.in);
static Map<String, Double> m = new HashMap<String, Double>();
public static void main(String[] args) {
Maps ms = new Maps();
int count = 1;
while(count <= 3){
System.out.println("Enter employee " + count);
name = sc.next();
System.out.println("------------------");
System.out.println("Enter salary for " + name);
salary = sc.nextDouble();
System.out.println("\n");
m.put(name, salary);
count += 1;
}
ms.displayMap();
}
public void displayMap(){
System.out.println("========================");
**I think the issue lies in here**
for(Entry<String, Double> employee : m.entrySet()){
String key = employee.getKey();
Double value = employee.getValue();
System.out.println(key + " \t " + value);
}
}
}
答案 0 :(得分:2)
如果要保持元素的插入顺序相同,则需要使用LinkedHashMap
。
Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。
答案 1 :(得分:0)
哈希地图不保证订单。请参考以下链接。
基于哈希表的Map接口实现。这个 实现提供了所有可选的map操作,以及 允许空值和空键。 (HashMap类大致是 相当于Hashtable,除了它是不同步的并允许 nulls。)这个类不保证地图的顺序;在 特别是,它不保证订单将保持不变 随着时间的推移。
答案 2 :(得分:0)
我建议使用LinkedHashMap或TreeMap。 LinkedHashMap按照插入顺序保存键,而TreeMap通过Comparator或元素的自然Comparable顺序保持排序。
由于它不必保持元素排序,因此对于大多数情况,LinkedHashMap应该更快;根据Javadocs,TreeMap对containsKey,get,put和remove有O(log n)性能,而LinkedHashMap对于每个都有O(1)。