在Java中使用TreeMap和LinkedHashMap按键对HashMap进行降序和升序排序 您所在的位置:网站首页 map方法的使用java 在Java中使用TreeMap和LinkedHashMap按键对HashMap进行降序和升序排序

在Java中使用TreeMap和LinkedHashMap按键对HashMap进行降序和升序排序

2023-03-24 16:54| 来源: 网络整理| 查看: 265

在本教程中,我们将学习如何在Java中按键对HashMap进行排序。

让我们继续创建一个简单的HashMap:

Map unsortedMap = new HashMap(); unsortedMap.put(“ John”,21); unsortedMap.put(“ Maria”,34); unsortedMap.put(“ Mark”,31); unsortedMap.put(“ Sydney”,24); unsortedMap.entrySet().forEach(System.out :: println);

我们的键是String,值是Integer。大多数情况下,您会遇到Integer或String作为键,以及自定义对象,String或Integer作为值。我们将根据String键对此HashMap进行排序。

资讯 - 互联网IT技术应用资讯 - 桑鸟网

HashMap 不保证以任何情况下维护其元素的顺序。顺序可能随时间而变化,肯定不会按插入顺序打印回来:

John = 21 Mark = 31 Maria = 34 Sydney = 24

如果重新运行此程序,它将保持此顺序,因为HashMap根据键的哈希值将其元素排序到存储桶中。从HashMap打印值时,其内容会按顺序打印,因此如果我们多次重新运行程序,则结果将保持不变。

使用TreeMap按键对HashMap进行排序

TreeMap扩展了SortedMap接口,与HashMap实现不同。 TreeMap旨在成为有序的对应物,但是,TreeMap仅根据键排序,给定一个比较器。

按字典顺序排序字符串密钥

创建TreeMap,给定一个HashMap就像提供未排序映射的构造函数调用一样简单:

Map sortedMap = new TreeMap (unsortedMap); sortedMap.entrySet().forEach(System.out :: println);

运行此代码会产生:

John = 21 Maria = 34 Mark = 31 Sydney = 24

由于我们没有提供任何比较器,因此将使用用于字符串的默认比较器。具体来说,当您比较字符串时,compareTo()方法会比较每个字符串的词汇值并按升序对它们进行排序。

我们将看到以“ A”开头的名称,在以“ B”开头的名称之前,等等。让我们添加两个新名称并查看发生了什么:

unsortedMap.put(“ Adam”,35); unsortedMap.put(“ Aaron”,22); Map sortedMap = new TreeMap (unsortedMap); sortedMap.entrySet().forEach(System.out :: println);

这导致:

Aaron = 22 Adam = 35 John = 21 Maria = 34 Mark = 31 Sydney = 24 使用自定义比较器对键进行排序

一个非常好的特性是,我们可以向TreeMap提供一个new Comparator ()并在其中指定我们自己的比较逻辑。例如,让我们看看如何使用HashMap中的String的长度,以及自定义比较器来按长度排序字符串键:

Map sortedMap = new TreeMap (new Comparator (){ @Override public int compare(String o1,String o2){ int lengthDifference = o1.length()- o2.length(); if(lengthDifference!= 0)return lengthDifference; return o1.compareTo(o2); } }); sortedMap.putAll(unsortedMap); sortedMap.entrySet().forEach(System.out :: println);

在这里,我们使用自定义Comparator构造了一个TreeMap,在重写的compare()方法中,我们指定了所需的逻辑。

https://www.sangniao.com/

由于我们无法保证o1.length()- o2.length()不为0,因此简单的if语句确保我们在长度相同的情况下按词汇顺序进行比较。

然后,一旦我们为TreeMap指定了排序标准,我们就使用putAll()方法将unsortedMap中的所有元素插入到sortedMap中。

运行此代码会产生:

Adam = 35 John = 21 Mark = 31 Aaron = 22 Maria = 34 Sydney = 24

该映射现在通过自定义Comparator进行排序,该自定义比较器在此情况下比较String键的length。您可以在此处使用任何逻辑以适应您的特定需求。

应用程序 - 程序员的软件应用工具箱 - 鸟网

使用LinkedHashMap按键对HashMap进行排序

LinkedHashMap 保留插入顺序。它保留了所有条目的双向链接列表,使您可以非常自然地访问和迭代其元素。

因此,将未排序的HashMap转换为LinkedHashMap的最简单方法是按我们希望它们出现的顺序添加元素。

按字典顺序排序HashMap键

现在,让我们继续按顺序创建一个新的LinkedHashMap,该LinkedHashMap将包含以排序顺序包含的元素。

Map.Entry类在这里起作用的非常方便 - comparingByKey(),如果它们具有有效的比较方法,则比较键。由于我们处理的是String,因此这是compareTo()方法,它将再次按字典顺序对String进行排序:

Map sortedMap = unsortedMap.entrySet()。stream() .sorted(Map.Entry.comparingByKey()) .collect(Collectors.toMap( Map.Entry :: getKey, Map.Entry :: getValue, (a,b)-> {throw new AssertionError(); }, LinkedHashMap :: new )); sortedMap.entrySet().forEach(System.out :: println);

在这里,我们流式传输了unsortedMap的Map.Entry对象集。然后,使用sorted()方法,我们提供了由comparingByKey()生成的方便的比较器,该比较器使用给定对象的默认比较实现来比较给定对象。

资讯 - 互联网IT技术应用资讯 - 桑鸟网

排序后,我们使用Collectors.toMap()将它们收集到一个新的映射中。当然,我们将使用与原始映射相同的键和值,通过Map.Entry :: getKey和Map.Entry :: getValue方法引用。

最后,实例化一个新的LinkedHashMap,将所有这些元素按顺序插入其中。

运行此代码会产生:

Aaron = 22 Adam = 35 John = 21 Maria = 34 Mark = 31 Sydney = 24 使用自定义比较器对HashMap键进行排序

或者,您可以使用自己的Comparator而不是Map.Entry.comparingByKey()生成的比较器。这就像向Comparator.comparing()提供有效的Lambda表达式一样简单:

Map sortedMap = unsortedMap.entrySet()。stream() .sorted(Comparator.comparing(e- > e.getKey()。length())) .collect(Collectors.toMap( Map.Entry :: getKey, Map.Entry :: getValue, (a,b)-> {throw new AssertionError(); }, LinkedHashMap :: new )); sortedMap.entrySet().forEach(System.out :: println);

在这里,我们重建了从前面部分开始按值排序键的自定义比较器。现在,String键将按其长度而不是其词汇顺序进行排序:

应用程序 - 程序员的软件应用工具箱 - 鸟网

Adam = 35 John = 21 Mark = 31 Aaron = 22 Maria = 34 Sydney = 24

当然,您可以通过在e.getKey()。length()前面添加-来轻松地从升序切换到降序:

Map sortedMap = unsortedMap.entrySet()。stream() .sorted(Comparator.comparing(e- > -e.getKey()。length())) .collect(Collectors.toMap( Map.Entry :: getKey, Map.Entry :: getValue, (a,b)-> {throw new AssertionError(); }, LinkedHashMap :: new )); sortedMap.entrySet().forEach(System.out :: println);

这导致:

Sydney = 24 Aaron = 22 Maria = 34 Adam = 35 John = 21 Mark = 31

此外,如果您处理整数值(我们在这里处理,但是通用比较器也有效),则可以使用其他比较器,例如Comparator.comparingInt(),Comparator.comparingDouble()或Comparator.comparingLong()以满足您的需求。

结论

在本教程中,我们已经介绍了如何按键对Java HashMap进行排序。最初,我们使用了TreeMap来对排序条目进行排序和维护其顺序,使用默认和自定义比较器。

然后,我们使用Java 8 Streams和LinkedHashMap类来实现此功能,无论是默认还是自定义比较器,都可以实现升序和降序。

版权声明:本文为桑鸟网博主「老墨呀」的原创文章,转载请附上原文出处链接及本声明。

本文标题:在Java中使用TreeMap和LinkedHashMap按键对HashMap进行降序和升序排序

本文地址:https://news.sangniao.com/p/187212584



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有