【问题标题】:Check if multiple objects have same value of a field in java and remove duplicates based on other fields检查多个对象是否在java中具有相同的字段值并根据其他字段删除重复项
【发布时间】:2021-11-01 15:55:42
【问题描述】:

所以我有一个对象列表。假设他们有 2 个字段 startDate、endDate(数据类型是时间戳)。因此,如果 startDate 等于另一个对象的 startDate,那么我必须选择具有更高 endDate 的对象。我怎样才能有效地实现这一目标。我可以使用 2 个 for 循环,但这会有很高的时间复杂度。有什么更好的方法吗?谢谢

【问题讨论】:

  • 一个以 startDate 为键的 HashMap。
  • @user3159253 如果可能的话,你能不能给一个代码 sn-p。谢谢?
  • 您可以使用 Comparable 或 Comparator 接口。您的类可以实现 Comparable 接口并覆盖 compareTo 方法。

标签: java arrays spring-boot object arraylist


【解决方案1】:

在您的列表中流式传输,使用您的对象 startdate 作为键收集到映射,并使用合并函数通过比较结束日期​​来决定如果两个或多个对象具有相同的开始日期,则映射到哪个对象。比如:

Collection<YourObject> result =
            
yourList.stream()
        .collect(Collectors.toMap(YourObject::getStartDate,
                                  Function.identity(),
                                  (a, b) -> a.getEndDate().after(b.getEndDate()) ? a : b))
        .values();

【讨论】:

    【解决方案2】:

    这是一个使用Integer 代替日期以使其更易于阅读的示例,但主体是相同的。只需更改比较运算符以适应并确保您的日期类可用作地图键。

    测试类:

    class Test {
      final Integer start;
      final Integer end;
    
      public Test(Integer s, Integer e) {
        this.start = s;
        this.end = e;
      }
    
      @Override
      public String toString() {
        return start + " " + end;
      }
    }
    

    使用Test 类的几个实例的代码示例:

    List<Test> l = Arrays.asList(new Test(1, 2), new Test(3, 4), new Test(1, 3), new Test(1, 1));
    
    Map<Integer, Test> m = l.stream()
                            .collect(
                                Collectors.toMap(
                                    o -> o.start,
                                    Function.identity(),
                                    (e, r) -> r.end > e.end ? r : e));
    
    m.values().forEach(System.out::println);
    

    输出:

    1 3
    3 4
    

    【讨论】:

      【解决方案3】:

      例如,您可以使用HashMap 并利用compute method

      hashMap.compute(newObject.getStartDate(), (key, value) -> 
         if (value == null) {
             newObject;
         } else if (value.getEndDate().after(newObject.getEndDate())) {
             value;
         } else {
             newObject;
         }
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多