首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用最新日期将Java ArrayList剪裁到不同的行

使用最新日期将Java ArrayList剪裁到不同的行
EN

Stack Overflow用户
提问于 2016-10-27 11:39:19
回答 3查看 266关注 0票数 2

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

代码语言:javascript
复制
public class MyData {
    String name;
    String key;
    String date;
    // ... constructor and other codes omitted here
}

List<MyData> myDataList;

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

如果我有

代码语言:javascript
复制
*Name* *key* *date*
 ABC    12    2016-10-09
 FGH    10    2016-10-18
 IJK    10    2016-10-08
 DEF    12    2016-10-19

那么修剪的结果应该是

代码语言:javascript
复制
*Name* *key* *date*
 DEF    12    2016-10-19
 FGH    10    2016-10-18

用算法做这件事的最好方法是什么?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-27 11:55:50

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

代码语言:javascript
复制
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获得相同的结果。

票数 2
EN

Stack Overflow用户

发布于 2016-10-27 11:49:57

只有在最近的情况下,才能使用与key相对应的HashMap和update对象。我让你写这个函数来比较两个日期。

代码语言:javascript
复制
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); 
}
票数 1
EN

Stack Overflow用户

发布于 2016-10-27 11:49:49

您可以使用流,请看下面的示例:

代码语言:javascript
复制
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()) )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40283689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档