如何对HashMap进行排序,这边文章我好爱,很有用,特转载留着以后cv

如何对HashMap进行排序

在这篇文章中,我们将介绍如何对HashMap进行排序,我们将讨论如何通过键或者值对HashMap进行排序。

为了下面文章的演示,我们先构造一个HashMap

@Data
@AllArgsConstructor
class Student{
    private Integer id;
    private String name;

    @Override
    public String toString() {
        return "{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
HashMap<Integer,Student> map=new HashMap<>();

@BeforeMethod
public void constructHashMap(){
    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类并使用Lombok来构造Getter和Setter方法。

  1. 通过TreeMap

因为TreeMap的内部是有序的,它默认的排序策略是根据key来进行排序,所以我们可以将HashMap中的元素放到TreeMap中来实现排序:

  1. 通过构造函数来创建
@Test
public void useTreeMap1() {
	TreeMap<Integer, Student> sortedMap = new TreeMap<>(map);
	System.out.println(sortedMap);
}

  1. 调用putAll()方法
@Test
public void useTreeMap2() {
	TreeMap<Integer, Student> sortedMap = new TreeMap<>();
	sortedMap.putAll(map);
	System.out.println(sortedMap);
}

  1. 通过ArrayList

如果我们只想对key或者value进行排序,而不是对整个map进行排序,我们可以通过ArrayList。

@Test
public void useArrayList() {
    List<Integer> mapKeys = new ArrayList<>(map.keySet());
    Collections.sort(mapKeys);
    System.out.println(mapKeys);

    List<Student> mapValues = new ArrayList<>(map.values());
    Collections.sort(mapValues, (s1, s2) -> s1.id.compareTo(s2.id));
    System.out.println(mapValues);
}

上面对key排序直接使用keySet()构造,但是如果要对value进行排序,那么我们Student需要基础Comparable接口,我们这里使用lambda表达式实现的,而不是采用继承接口。
3. 通过TreeSet

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

@Test
public void useTreeSet() {
    TreeSet<Integer> mapKeys = new TreeSet<>(map.keySet());
    System.out.println(mapKeys);
}

同样的,我们也可以对value使用TreeSet排序。
4. 通过Java8的Streams

使用Stream按key进行排序

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));

如果要按value进行排序

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

如果我们要按逆序进行排序,则使用Collections.reverseOrder()

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

————————————————
版权声明:本文为CSDN博主「码路编」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/l2580258/article/details/89227822

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,HashMap是一种无序的数据结构,因此不能直接对其进行排序。但是,可以通过将HashMap中的键值对转换成List,然后对List进行排序来实现对HashMap排序。 具体步骤如下: 1. 将HashMap中的键值对转换成List,可以使用HashMap中的entrySet()方法,将其转换成Set,再使用ArrayList的构造函数将其转换成List。 2. 对List进行排序,可以使用Collections类中的sort()方法,并指定排序规则。这里可以使用Comparator接口的实现类来指定排序规则,也可以直接对值或键进行排序。 3. 将排序后的List转换回HashMap,可以使用HashMap的构造函数,并传入排序后的List作为参数。 以下是示例代码: ```java HashMap<String, Integer> map = new HashMap<>(); map.put("c", 3); map.put("a", 1); map.put("d", 4); map.put("b", 2); List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getKey().compareTo(o2.getKey()); } }); HashMap<String, Integer> sortedMap = new LinkedHashMap<>(); for (Map.Entry<String, Integer> entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } System.out.println(sortedMap); // 输出:{a=1, b=2, c=3, d=4} ``` 在示例代码中,通过将HashMap中的键值对转换成List,并使用Collections类的sort()方法对List进行排序,指定了按照键的升序排序规则。最后,将排序后的List转换回HashMap。注意,这里使用了LinkedHashMap,是因为HashMap是无序的,如果想保排序结果,需要使用有序的Map。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值