java - 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, 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)]
分组排序后我期望的结果,
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)]
}
}
o/p 根据值排序(10->(5+4)->8->4->2)
到目前为止我已经尝试过=infos.stream().collect(Collectors.groupingBy(Info::getAccount, Collectors.groupingBy(r -> r.getOpportunity(), Collectors.toList())))
但它是随机排序的。
解决方案
value
要根据 的进行排序Info
,
- 通过比较 ,使流排序
value
,以便分组按顺序执行。 - 调用groupingBy时,指定LinkedHashMap以
mapFactory
保留插入顺序。
下面的程序演示了如何实现。
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Info {
private String account;
private String opportunity;
private Integer value;
private String desc;
private Info(String account, String opportunity, Integer value, String desc) {
super();
this.account = account;
this.opportunity = opportunity;
this.value = value;
this.desc = desc;
}
public static void main(String[] args) {
List<Info> infos = new ArrayList<>();
infos.add(new Info("12", "absddd", 4, "production"));
infos.add(new Info("1234", "abss", 10, "vip"));
infos.add(new Info("1234", "abs", 4, "test"));
infos.add(new Info("1234", "abs", 5, "testing"));
infos.add(new Info("123", "abss", 8, "vip"));
infos.add(new Info("12", "absooo", 2, "test"));
Map<String, Map<String, List<Info>>> sortedResult = infos.stream().sorted(Info::compareByValueDesc)
.collect(Collectors.groupingBy(Info::getAccount, LinkedHashMap::new,
Collectors.groupingBy(r -> r.getOpportunity(), LinkedHashMap::new, Collectors.toList())));
sortedResult.forEach((key, value) -> System.out.println(key + value.toString()));
}
public static int compareByValueDesc(Info other1, Info other2) {
return -other1.value.compareTo(other2.value);
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getOpportunity() {
return opportunity;
}
public void setOpportunity(String opportunity) {
this.opportunity = opportunity;
}
public String toString() {
return this.value.toString();
}
}
推荐阅读
- java - Android:“无法解析组中的方法‘setVisibility’”
- react-native - 如何在 React Native 中正确旋转和翻译文本 90 度?
- tabulator - Tabulator 4.9,有没有办法在一个单元格中使用 2 种不同颜色的文本?
- python - 未显示 Django/python 图像
- awk - mosquitto_pub 一段时间后返回 4
- ios - iOS 15 WKWebView 显示不正确的图像
- swift - Swift:重绘 PDF 时分辨率丢失
- python - 与网络上的任何人共享交互式 python jupyter 笔记本,其中包含另一个文件 (.py) 中的依赖文件和函数:Colab 还是其他?
- c# - Razor 组件未呈现
- android - Gradle 同步失败 Flutter 2.5.1