当前位置: 首页 > 知识库问答 >
问题:

为什么LinkedHashMap不能排序HashMap而TreeMap可以呢?

苍烨然
2023-03-14

我正在尝试使用LinkedHashMapTreemapHashMap的输出进行排序。

当我使用treemap来整理hashmap时,它的工作方式非常好。

        Map<Integer, String> hMap = new HashMap<Integer, String>();

        hMap.put(40, "d");
        hMap.put(10, "a");
        hMap.put(30, "c");
        hMap.put(20, "b");

        System.out.println(" ");
        System.out.println("before");

        for (Map.Entry m1 : hMap.entrySet()) {
            System.out.print(m1.getKey() + " " + m1.getValue() + "    ");
        }

        System.out.println("after");

        Map<Integer, String> hTree = new TreeMap<Integer, String>(hMap);
        for (Map.Entry m2 : hTree.entrySet()) {
            System.out.print(m2.getKey() + " " + m2.getValue() + "    ");
        }

输出:
前20 b 40 d 10 a 30 c
后10 a 20 b 30 c 40 d

        Map<Integer, String> hMap = new HashMap<Integer, String>();

        hMap.put(10, "a");
        hMap.put(20, "b");
        hMap.put(30, "c");
        hMap.put(40, "d");

        System.out.println("before");

        for (Map.Entry m1 : hMap.entrySet()) {
            System.out.print(m1.getKey() + " " + m1.getValue() + "    ");
        }
        System.out.println(" ");
        System.out.println("after");

        LinkedHashMap<Integer, String> lhMap = new LinkedHashMap<Integer, String>(hMap);

        Iterator it = lhMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry me = (Map.Entry) it.next();
            System.out.print(me.getKey() + " " + me.getValue()+"   ");
        }
before
20 b    40 d    10 a    30 c     
after
20 b   40 d   10 a   30 c  

谁能告诉我为什么这种排序不起作用?becuaseLinkedHashMap正在过滤HashMap吗?
这是为什么treemap不受该问题的影响吗?
谢谢

共有1个答案

昌砚
2023-03-14

LinkedHashMap维护插入顺序。这意味着,如果向构造函数传递一个排序的映射,或者将LinkedHashMap中的键按排序的顺序放置,它将保持排序。

但是,您将Hashmap传递给LinkedHashmap构造函数,并且它没有排序(因为Hashmap没有排序)。因此,生成的LinkedHashMap也没有排序。

另一方面,treemap保持键的排序,因此将键放入treemap中的顺序(在您的示例中,这是由在源代码hashmap上迭代时遇到键的顺序决定的)并不重要-结果的map将始终被排序。

 类似资料:
  • 现在我想要的输出是: {0,41},{10.3f,50.05f,9.9f} {10,7},{0.14f,1.2f,85.01f}

  • 问题内容: 是什么区别,而在中?我没有看到输出的任何差异,因为这三个都有和。什么是? 问题答案: 这三个类都实现了该接口,并提供了几乎相同的功能。最重要的区别是通过条目进行迭代的顺序: 绝对不保证迭代顺序。添加新元素时,它甚至可以(并将)完全改变。 将根据密钥的“自然顺序”(根据其方法)(或外部提供的)进行迭代。此外,它实现了SortedMap接口,该接口包含依赖于此排序顺序的方法。 将按照条目放

  • 问题内容: 在Python中,用于初始化不可变类型,通常用于初始化可变类型。如果将其从语言中删除,该怎么办(轻松)? 例如, 可以这样重写: 为澄清问题的范围:这不是一个问题关于如何以及是使用或它们之间有什么区别。这是一个问题,如果从语言中删除将会发生什么。有什么坏事吗?事情会变得很难或不可能吗? 问题答案: 您可以在中进行的所有操作都可以在中完成。 那么,为什么要使用? 因为您不必将实例存储在变

  • 问题内容: 我开始学习Java。什么时候可以在TreeMap上使用HashMap? 问题答案: 是一个的示例,这意味着可以对键的顺序进行排序,并且在对键进行迭代时,可以期望它们会按顺序排列。 另一方面,不作任何保证。因此,当遍历a的键时,您无法确定它们将以什么顺序排列。 一般而言,它会更有效,因此只要您不关心键的顺序,都可以使用它。

  • 我在vue3项目中使用了 '@vueuse/gesture' 的useWheel函数来帮助监听滚轮在一个元素上的滑动,但我发现指令能生效,而Composable的写法却不生效,无法触发wheelHandler回调。 我在调用useWheel之前也log了 workspaceArea.value是有值的,正常的。 是我的代码写的有问题吗?还是库的bug?

  • } 如果您可以在上面的示例中看到,我显式地使hashcode()在所有情况下都返回1,以检查当hashmap中key.hashcode()发生冲突时会发生什么。发生什么,为这些Map维护一个链表。条目对象,例如 1(key.hashcode())将链接到 (据我所知,假值是在真值之后输入的)。 但是当我做keySet()时,true先返回,然后false,而不是false先返回。 所以,我在这里假