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

Java8:按多个字段分组,然后根据值排序,java,lambda,groupingby,Java,Lambda,Groupingby,我有一个叫做Info 公共类信息{ 私人字符串帐户; 私人串机会; 私有整数值; 私有字符串描述; } 我想将信息列表按两个字段(account和opportunity)分组,然后根据值对其排序。即 分组和排序前的信息列表: List<Info> infos = [(account = 1234, opportunity = abs, value = 4, desc= test), (account = 1234, opportunity = abs, value = 5, des

我有一个叫做
Info

公共类信息{
私人字符串帐户;
私人串机会;
私有整数值;
私有字符串描述;
}
我想将
信息列表按两个字段(account和opportunity)分组,然后根据值对其排序。即
分组和排序前的信息列表:

List<Info> infos = [(account = 1234, opportunity = abs, value = 4, desc= test),
(account = 1234, opportunity = abs, value = 5, desc = testing),
(account = 1234, opportunity = abss, value = 10, desc = vip),
(account = 123, opportunity = abss, value = 8, desc = vip),
(account = 12, opportunity = absddd, value = 4, desc = production),
(account = 12, opportunity = absooo, value = 2, desc = test)]
List infos=[(账户=1234,机会=abs,价值=4,描述=test),
(账户=1234,机会=abs,价值=5,描述=测试),
(账户=1234,机会=abss,价值=10,描述=vip),
(账户=123,机会=abss,价值=8,描述=vip),
(账户=12,机会=absddd,价值=4,描述=生产),
(account=12,opportunity=Absoloo,value=2,desc=test)]
分组排序后的结果

Map<String, Map<String, List<Info>>> result = {
    1234 = {
        abss = [(account = 1234, opportunity = abss, value = 10, desc = vip)],
        abs = [(account = 1234, opportunity = abs, value = 5, desc = testing),  
               (account = 1234, opportunity = abs, value = 4, desc = test)]
    },
    123 = {
        abss = [(account = 123, opportunity = abss, value = 8, desc = vip)]
    },
    12 = {
        absddd = [(account = 12, opportunity = absddd, value = 4, desc = production)],
        absooo = [(account = 12, opportunity = absooo, value = 2, desc = test)]
    }
}
映射结果={
1234 = {
资产负债表=[(账户=1234,机会=资产负债表,价值=10,描述=vip)],
abs=[(账户=1234,机会=abs,价值=5,描述=测试),
(account=1234,opportunity=abs,value=4,desc=test)]
},
123 = {
abss=[(账户=123,机会=abss,价值=8,描述=vip)]
},
12 = {
absddd=[(账户=12,机会=absddd,价值=4,描述=production)],
绝对oo=[(账户=12,机会=绝对oo,价值=2,描述=test)]
}
}
o/p根据值(10->(5+4)->8->4->2)排序


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

要根据
Info
值进行排序

  • 通过比较
    ,生成流,以便按顺序执行分组
  • 调用时,在
    mapFactory
    中指定以保留插入顺序
  • 下面的程序演示了如何实现


    import java.util.ArrayList;
    导入java.util.LinkedHashMap;
    导入java.util.List;
    导入java.util.Map;
    导入java.util.stream.collector;
    公共类信息{
    私人字符串帐户;
    私人串机会;
    私有整数值;
    私有字符串描述;
    私有信息(字符串帐户、字符串机会、整数值、字符串描述){
    超级();
    这个账户=账户;
    这个。机遇=机遇;
    这个值=值;
    this.desc=desc;
    }
    公共静态void main(字符串[]args){
    List infos=new ArrayList();
    信息添加(新信息(“12”,“absddd”,4,“生产”);
    信息添加(新信息(“1234”,“abss”,10,“vip”);
    信息添加(新信息(“1234”,“abs”,4,“测试”);
    信息添加(新信息(“1234”,“abs”,5,“测试”);
    信息添加(新信息(“123”,“abss”,8,“vip”);
    添加(新信息(“12”,“绝对”,2,“测试”);
    Map sortedResult=infos.stream().sorted(信息::compareByValueDesc)
    .collect(Collectors.groupingBy)(信息::getAccount,LinkedHashMap::new,
    Collectors.groupby(r->r.getOpportunity(),LinkedHashMap::new,Collectors.toList());
    sortedResult.forEach((key,value)->System.out.println(key+value.toString());
    }
    公共静态int compareByValueDesc(信息其他1,信息其他2){
    返回-other1.value.compareTo(other2.value);
    }
    公共字符串getAccount(){
    返回帐户;
    }
    公共无效设置帐户(字符串帐户){
    这个账户=账户;
    }
    公共字符串getOpportunity(){
    返回机会;
    }
    公共作废setOpportunity(字符串opportunity){
    这个。机遇=机遇;
    }
    公共字符串toString(){
    返回此.value.toString();
    }
    }
    
    到目前为止您尝试了什么?Info.stream().collect(Collectors.groupingBy(Info::getAccount,Collectors.groupingBy(r->r.getOpportunity(),Collectors.toList()))但其排序随机性请将其添加到您的问题中。更新了问题部分谢谢您的答复。但我在尝试满足以下输入
    infos.add(新信息(“12”,“absddd”,4,“production”))时遇到了问题;信息添加(新信息(“1234”,“abss”,11,“vip”);信息添加(新信息(“12345”,“abs”,4,“测试”);信息添加(新信息(“12345”,“abs”,5,“测试”);信息添加(新信息(“123”,“abss”,8,“vip”);添加(新信息(“12”,“绝对”,2,“测试”)在本例中,输出为
    1234{abss=[11]}123{abss=[8]}12345{abs=[5,4]}12{absddd=[4],absoo=[2]}
    ;你对这种情况有什么期待?我想根据groupingby和summingLong对它进行排序,在上面的评论中,我提到的输入,o/p应该是
    1234{abss=[11]}12345{abs=[5,4]}123{abss=[8]}12{absddd=[4],absoo=[2]}
    我似乎误解了你的需要,我建议你编辑你的帖子,提供你需要的订购1。帐户组条目,2。机会组条目,3。机会组中的值。是的,我要的值是不可能通过地图地图得到的。尝试不同的过程。