Java Hashmap:打印地图值后,键没有相应排序

时间:2016-11-16 10:21:05

标签: java hashmap

我写了一个使用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);
    }







}

}

3 个答案:

答案 0 :(得分:2)

如果要保持元素的插入顺序相同,则需要使用LinkedHashMap

LinkedHashMap

  

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

答案 1 :(得分:0)

哈希地图不保证订单。请参考以下链接。

Java 8 Hash Map

  

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

答案 2 :(得分:0)

使用TreeMapLinkedHashMap

我建议使用LinkedHashMap或TreeMap。 LinkedHashMap按照插入顺序保存键,而TreeMap通过Comparator或元素的自然Comparable顺序保持排序。

由于它不必保持元素排序,因此对于大多数情况,LinkedHashMap应该更快;根据Javadocs,TreeMap对containsKey,get,put和remove有O(log n)性能,而LinkedHashMap对于每个都有O(1)。