将Java数组列表修剪为具有最新日期的不同行



我有MyDataList如下所示。它由多行MyData对象组成。有的key相同,但datename不同

public class MyData {
    String name;
    String key;
    String date;
    // ... constructor and other codes omitted here
}
List<MyData> myDataList;

我正在考虑根据最新的date将列表修剪为不同的key

。如果我有

*Name* *key* *date*
 ABC    12    2016-10-09
 FGH    10    2016-10-18
 IJK    10    2016-10-08
 DEF    12    2016-10-19

则修剪结果应为

*Name* *key* *date*
 DEF    12    2016-10-19
 FGH    10    2016-10-18

算法上最好的方法是什么?

注意:我在Java 7上,不能使用Java 8的流功能。(这是Android开发,Java 8还不支持)。

假设您使用date属性的真实日期类型,您可以这样做:

private Collection<MyData> trim(List<MyData> data) {
    Map<String, MyData> result = new HashMap<>();
    for (MyData item : data) {
        MyData lastItem = result.get(item.getKey());
        if (lastItem == null || lastItem.getDate().before(item.getDate())) {
            result.put(item.getKey(), item);
        }
    }
    return result.values();
}

您可以使用HashMap并更新与键对应的对象,仅当它是最近的。我让你写一个函数来比较两个日期。

HashMap<Integer, MyData> trimedData = new HashMap<>();
for (MyData d : myDataList){
    MyData dataSaved= trimedData.get(d.key);
    if (dataSaved!= null){
        if(d.date > dataSaved.data){ // Here use correct method to compare date
            trimedData.put(d.key, d);
        }
    }
    else trimedData.put(d.key, key); 
}

你可以使用流,看看这个例子:

ArrayList<String> strings = new ArrayList<>();
strings.add("cbab");
strings.add("abab");
strings.add("dabab");
strings.add("ddabab");
Map<Integer, Optional<String>> collect = strings
    .stream()
    .collect(Collectors.groupingBy(String::length,
        Collectors.maxBy(Comparator.comparingInt((c) -> (int) charAt(0)))));
System.out.println(collect);

String::length更改为MyData::key,将comparator更改为比较日期(Collectors.maxBy((MyData d1, Mydate d2) -> d1.getDate().compareTo(d2.getDate()) .

)

最新更新