按ArrayList中的最大时间戳分组属性ID

时间:2018-04-30 19:02:04

标签: java sorting

我有一个arraylist,它包含一个由多个ID组成的对象,并且它归因于时间戳。在arraylist中有多个具有不同时间戳的id。我想获得每个id的最大时间戳。我怎么能这样做?

我创建了以下用于排序的函数:

public Map<Integer,Date> getMaximumDateForId(Session session) throws ParseException {
    Map<Integer,Date> mapIdDate = new HashMap<Integer,Date>();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    List<CSVServiceBaseFormat>  listOfRemovedEntitlements = getListOfServiceProviderId(session);
        for(CSVServiceBaseFormat record : listOfRemovedEntitlements){
            if(!mapIdDate.containsKey(record.getBbd_id())){
                    mapIdDate.put(Integer.parseInt(record.getBbd_id()),formatter.parse(record.getActivity_date()));

            }else{
                if((mapIdDate.get(formatter.parse(record.getActivity_date()))).before(formatter.parse(record.getActivity_date()))){
                    mapIdDate.put(Integer.parseInt(record.getBbd_id()),formatter.parse(record.getActivity_date()));
                }
            }
        }
        return mapIdDate;
}

1 个答案:

答案 0 :(得分:1)

对于示例,我假设以下类。

public class Activity {

    int id;
    LocalDate date;

    // constructor, getters, toString method

}

获取每个ID的最新日期:

    List<Activity> elements = // …
    Map<Integer, LocalDate> latestDates = elements.stream()
            .collect(Collectors.groupingBy(Activity::getId, 
                    Collectors.mapping(Activity::getDate,
                            Collectors.collectingAndThen(Collectors.maxBy(LocalDate::compareTo), 
                                    Optional::get))));

我使用以下列表尝试了代码:

 4 2018-03-07
 3 2018-03-14
 4 2018-02-11
 3 2018-02-18
 1 2018-01-24
 2 2018-01-02
 5 2018-03-13
 4 2017-10-01
 5 2018-01-09
 3 2017-10-11

生成的地图打印为:

  

{1 = 2018-01-24,2 = 2018-01-02,3 = 2018-03-14,4 = 2018-03-07,5 = 2018-03-13}

如果您发现流代码太难以遵循,请改用循环。

编辑:我之前的流表达式是:

    Map<Integer, LocalDate> latestDates = elements.stream()
            .collect(Collectors.groupingBy(Activity::getId, 
                    Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Activity::getDate)), 
                            optAct -> optAct.get().getDate())));

即使旧版本的行更短,我认为新版本更自然,因为它在查找最新日期之前将“活动对象”映射到日期(而不是相反)。如果您需要活动(不仅仅是日期),旧表达式将是一个更好的起点。