Java 8:按多个字段分组,然后根据值排序

问题描述

我有一个名为Info

的课程
public class Info {
    private String account;
    private String opportunity;
    private Integer value;
    private String desc;
}

我想将Info的列表按两个字段(帐户和机会)分组,然后根据值对它进行排序。即 分组和排序之前的信息列表:

List<Info> infos = [(account = 1234,opportunity = abs,value = 4,desc= test),(account = 1234,value = 5,desc = testing),opportunity = abss,value = 10,desc = vip),(account = 123,value = 8,(account = 12,opportunity = absddd,desc = production),opportunity = absooo,value = 2,desc = test)]

我期望在分组和排序后的结果,

Map<String,Map<String,List<Info>>> result = {
    1234 = {
        abss = [(account = 1234,desc = vip)],abs = [(account = 1234,desc = test)]
    },123 = {
        abss = [(account = 123,desc = vip)]
    },12 = {
        absddd = [(account = 12,desc = production)],absooo = [(account = 12,desc = test)]
    }
}

o / p根据值(10->(5 + 4)-> 8-> 4-> 2)进行排序

到目前为止,我已经尝试过= infos.stream().collect(Collectors.groupingBy(Info::getAccount,Collectors.groupingBy(r -> r.getopportunity(),Collectors.toList()))),但它是随机排序的。

解决方法

要基于value的{​​{1}}进行排序,

  1. 通过比较Info,使流sorted成为分组,以便按顺序执行分组。
  2. 调用groupingBy时,请在value中指定LinkedHashMap以保留插入顺序。

下面的程序演示了如何实现。


mapFactory