我有MyData
的List
如下所示。它由多行MyData对象组成。有的key
相同,但date
和name
不同
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())
.