【问题标题】:java comparator for two LocalDateTimes两个 LocalDateTimes 的 java 比较器
【发布时间】:2015-09-08 01:17:11
【问题描述】:

一个名为MyCustomClass 的自定义类有一个属性,它是joda LocalDateTime。我需要创建一个java.util.Comparator 类来通过TimeStamp 属性比较MyCustomClass 的实例,该属性的类型为LocalDateTime。我已经阅读了几篇关于此的帖子(包括this one),并且我尝试了所有方法,但答案中显示的方法似乎都不起作用。例如以下几种方法会抛出编译错误:

import java.time.temporal.ChronoUnit;
import java.util.Comparator;

import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Period;

import my.app.model.MyCustomClass;

public class MyCustomClassComparator implements Comparator<MyCustomClass>{
    public int compare(MyCustomClass mcc1, MyCustomClass mcc2) {
        //this first attempt throws a return type error for the method.
        return Period.fieldDifference(mcc2.getTimestamp(), mcc1.getTimestamp());
        //This next attempt says that LocalDateTimes are not valid arguments
        Duration.between(mcc2.getTimestamp(), mcc1.getTimestamp());
        //The next approach also says LocalDateTimes are not valid arguments.
        DateTime.parse(mcc2.getTimestamp()), mcc1.getTimestamp()).getSeconds();
        //This boilerplate approach says the minus sign is not valid for LocalDateTime
        return mcc1.getTimestamp() - mcc2.getTimestamp();
    }
}

我打算在其他代码中使用它,例如:

List<MyCustomClass> mccs = new ArrayList<MyCustomClass>();
// Sort by time stamp:
Collections.sort(mccs, new MyCustomClassComparator());

如何编写一个Comparator 类来根据它们的 Joda LocalDateTime 属性比较 MyCustomClass 的实例?

【问题讨论】:

  • LocalDateTime 不是已经Comparable 了吗?你不能用mcc1.compareTo(mcc2)吗?
  • 或者完全取消Comparator...
  • @MadProgrammer 警告:如果MyCustomClass 以相同的比较实现Comparable&lt;MyCustomClass&gt;,则只能取消Comparator
  • @Andreas 不确定我明白。 Comparator 的唯一需要是 Comparable 的默认实现不是你想要的,但我看不到任何地方 OP 对它们的比较做了一些特别的事情

标签: java time jodatime comparator


【解决方案1】:

如果您只需要一个比较器实例:

类似于Iłya Bursov的回答,因为LocalDateTime实现了可比性,可以使用Comparator.comparing

Comparator.comparing(MyCustomClass::getTimestamp)

【讨论】:

    【解决方案2】:

    LocalDateTime 实现了comparable 接口,所以你可以像这样实现比较器:

    public class MyCustomClassComparator implements Comparator<MyCustomClass> {
        @Override
        public int compare(final MyCustomClass mcc1, final MyCustomClass mcc2) {
            return mcc1.getTimestamp().compareTo(mcc2.getTimestamp());
        }
    }
    

    【讨论】:

      【解决方案3】:

      鉴于 Comparator 是一个函数式接口,我们可以使用单个 lambda 表达式来实现它。

      Comparator<LocalDateTime> localDateTimeComparator = (o1, o2) -> o1.compareTo(o2);
      
      //Then use the comparator as always....
      LocalDateTime minDate = dates.stream()
                                   .min(localDateTimeComparator)
                                   .orElseThrow(Assertion::Error)
                         
      

      为了重用,静态实例可能会有所帮助

      //interfaces are "more static" than classes with "static members" ;-)
      public interface MyDateUtils { 
      
         Comparator<LocalDateTime> localDateTimeComparator = (o1, o2) -> o1.compareTo(o2);
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-18
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        相关资源
        最近更新 更多