用Java对HashMap排序

介绍:

在本教程中,我们将学习如何对Java HashMap进行排序。 我们可以按键或按值对HashMap进行排序。 我们将讨论这两种策略。

对Java

为了跟上本文的其余部分,我们首先构造一个HashMap:

HashMap<Integer, Student> map = new HashMap<>();
 
map.put(1003, new Student(1003, "Sam"));
map.put(1005, new Student(1005, "Joseph"));
map.put(1001, new Student(1001, "Kate"));
map.put(1002, new Student(1002, "Miranda"));
map.put(1004, new Student(1004, "Peter"));

其中Student是一个具有ID名称作为其字段的POJO:

class Student {
    
    private Integer id;
    private String name;
    
    Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public String toString() {
        return "[id="+id + ", name=" + name + "]";
    }
    
}

现在,让我们看一下可以对HashMap进行排序的不同方法

1.使用

众所周知, TreeMap是一个排序的Map ,默认情况下,元素是根据其键的自然顺序进行排序的。 因此,一种基本方法是将所有元素从HashMap推送到TreeMap:

TreeMap<Integer, Student> sortedMap = new TreeMap<>(map);
 
//Or else
 
TreeMap<Integer, Student> sortedMap = new TreeMap<>();
sortedMap.putAll(map);

请注意, 我们可以将原始HashMap本身传递到构造函数中,也可以使用putAll()方法。 这样,我们的sortedMap将按键值的排序顺序保存元素:

{1001=[id=1001, name=Kate], 1002=[id=1002, name=Miranda]
, 1003=[id=1003, name=Sam], 1004=[id=1004, name=Peter]
, 1005=[id=1005, name=Joseph]}

2.使用ArrayList:

如果我们只需要排序的键或值,而不真正在乎Map ,则可以使用ArrayList。

在这里,我们将首先将键或值提取到ArrayList中 ,然后使用Collections.sort()列表进行排序:

List<Integer> mapKeys = new ArrayList<>(map.keySet());
Collections.sort(mapKeys);
 
//Or
List<Student> mapValues = new ArrayList<>(map.values()); 
Collections.sort(mapValues);

在这里,仅当我们的学生实现Comparable时,才可以按值对Map进行排序

public class Student implements Comparable<Student> {
 
    ...
 
    public int compareTo(Student other) {
        return this.id.compareTo(other.id);
    }
}

之所以如此,是因为我们地图中的值是一个自定义类型对象– Student

3.使用TreeSet:

如果我们还打算避免在键或值的结果列表中出现任何重复,则可以选择TreeSet:

SortedSet<String> mapKeys = new TreeSet<>(map.keySet());

同样,我们可以创建一组排序的地图值。 但是, 我们必须重写equals()hashCode()方法,以使其适用于自定义对象。

4. Java 8流:

从Java 8开始,我们可以使用Stream API对地图进行排序。 要使用键对Java Map进行排序,我们需要:

Map<Integer, Student> sortedMap = map.entrySet()
                                  .stream()
                                  .sorted(Map.Entry.comparingByKey())
                                  .collect(Collectors
                                    .toMap(Map.Entry::getKey,
                                           Map.Entry::getValue,
                                           (e1, e2) -> e1,
                                           LinkedHashMap::new));

在这里, 我们将排序后的地图收集到LinkedHashMap中,以保留排序后的order

同样,要按值对地图进行排序,我们将使用compareByValue()

sortedMap = map.entrySet()
              .stream()
              .sorted(Map.Entry.comparingByValue())
               .collect(Collectors
                          .toMap(Map.Entry::getKey,
                                 Map.Entry::getValue,
                                 (e1, e2) -> e1,
                                 LinkedHashMap::new));

通常,在处理自定义对象时,该对象必须实现Comparable接口。

我们有一篇有关Java 8 Collectors的详细文章,它将帮助您了解Collectors.toMap()方法的用法。

为了按降序对地图进行排序,我们可以简单地使用Collections.reverseOrder():

sortedMapDesc = map.entrySet()
                  .stream()
                  .sorted(Collections.reverseOrder(Map.Entry.comparingByKey()))
                  .collect(Collectors
                   .toMap(Map.Entry::getKey,
                          Map.Entry::getValue,
                          (e1, e2) -> e1,
                           LinkedHashMap::new));

让我们在控制台上打印sortedMapDesc

{1005=[id=1005, name=Joseph], 1004=[id=1004, name=Peter],
1003=[id=1003, name=Sam], 1002=[id=1002, name=Miranda],
 1001=[id=1001, name=Kate]}

如我们所见,现在地图按键降序排列。

结论:

在本文中,我们介绍了使用TreeMap,ArrayList或TreeSet对Java HashMap进行排序的各种方法。 我们还介绍了Java 8 Stream API sorted()方法,该方法可以帮助我们按键或值对地图进行排序。

成为第一个发表评论的人。

翻译自: https://www.javacodegeeks.com/2019/03/sorting-hashmap-java.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值