我有一个实体列表,如果它们属于同一组,则它们共享相同的组号
<表类>
开始停止GroupNum tbody><<tr>2018-11-13 2019-01-13 1 2019-01-14 2019-03-06 1 2019-03-07 2019-11-18 1 2020-08-23 2020-08-23 2 2021-11-19 2022-12-23 2 表类>
试试这个
public static void main(String[] args) throws ParseException {
List<Entities> baseList = List.of(
new Entities("2018-11-13", "2019-01-13", 1),
new Entities("2019-01-14", "2019-03-06", 1),
new Entities("2019-03-07", "2019-11-18", 1),
new Entities("2020-08-23", "2020-08-23", 2),
new Entities("2021-11-19", "2022-12-23", 2));
List<Entities> result = baseList.stream()
.collect(Collectors.groupingBy(Entities::getGroupNum))
.entrySet().stream()
.map(e -> new Entities(
e.getValue().get(0).getStart_dt(),
e.getValue().get(e.getValue().size() - 1).getStop_dt(),
e.getKey()))
.toList();
result.forEach(System.out::println);
}
输出:
Entities [start_dt=2018-11-13, stop_dt=2019-11-18, groupNum=1]
Entities [start_dt=2020-08-23, stop_dt=2022-12-23, groupNum=2]
我假设您希望按如下方式聚合Entities
:
groupNum
将作为分组标准- 应使用最早的
start_dt
和最晚的stop_dt
。
正如我在评论中已经建议的那样,尝试使用Map<Integer, Entities>
,其中关键是组号:
Map<Integer, Entities> aggregates = new HashMap<>();
for( Entities entry : baseList ) {
//get the aggregate or create it if none exists for this group
Entities aggregate = aggregates.computeIfAbsent(entry.getGroupNum(),
k -> new Entities(entry.getStart_Dt(), entry.getStop_Dt(), entry.getGroupNum());
//compare and update the dates as needed
if( aggregate.getStart_Dt().compareTo(entry.getStart_Dt()) > 0) {
aggregate.setStart_Dt(entry.getStart_Dt());
}
if( aggregate.getStop_Dt().compareTo(entry.getStop_Dt()) < 0) {
aggregate.setStart_Dt(entry.getStop_Dt());
}
}
注意事项:
这种方法不需要对列表进行排序,也不维护任何顺序。如果需要按组号排序,可以使用
TreeMap
来按组号排序,或者使用LinkedHashMap
来保持列表的顺序(尽可能适用-毕竟您正在合并列表元素)如果你想使用
java.time
,例如LocalDate
而不是java.util.Date
,你可以使用更容易读取的isBefore()
和isAfter()
方法。如果不想检查新创建的聚合的日期,请使用以下代码段作为循环体:
Entities aggregate = aggregates.get(entry.getGroupNum()); if( aggregate == null ) { aggregates.put( entry.getGroupNum(), new Entities(entry.getStart_Dt(), entry.getStop_Dt(), entry.getGroupNum()); } else { if( aggregate.getStart_Dt().compareTo(entry.getStart_Dt()) > 0) { aggregate.setStart_Dt(entry.getStart_Dt()); } if( aggregate.getStop_Dt().compareTo(entry.getStop_Dt()) < 0) { aggregate.setStart_Dt(entry.getStop_Dt()); } }