我有一个List of MyData如下所示。它由多行MyData对象组成。有些有相同的key,但有不同的date和name
public class MyData {
String name;
String key;
String date;
// ... constructor and other codes omitted here
}
List<MyData> myDataList;我正在考虑根据最新的key将列表裁剪成不同的date
如果我有
*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的Stream特性(这是用于Android开发的,Java 8还不支持)。
发布于 2016-10-27 11:55:50
假设您对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();
}您可能会使用streams获得相同的结果。
发布于 2016-10-27 11:49:57
只有在最近的情况下,才能使用与key相对应的HashMap和update对象。我让你写这个函数来比较两个日期。
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);
}发布于 2016-10-27 11:49:49
您可以使用流,请看下面的示例:
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,比较器更改为比较日期(Collectors.maxBy((MyData d1, Mydate d2) -> d1.getDate().compareTo(d2.getDate()) )。
https://stackoverflow.com/questions/40283689
复制相似问题