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。机会组中的值。是的,我要的值是不可能通过地图地图得到的。尝试不同的过程。