如何根据元素共享的值聚合元素

  • 本文关键字:元素 共享 何根 java list
  • 更新时间 :
  • 英文 :


我有一个实体列表,如果它们属于同一组,则它们共享相同的组号

<表类> 开始停止GroupNumtbody><<tr>2018-11-132019-01-1312019-01-142019-03-0612019-03-072019-11-1812020-08-232020-08-2322021-11-192022-12-232

试试这个

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());
    }
    }
    

相关内容

最新更新