如何将Comparator转换为比较?

这是我想要获取的代码。

public static final Comparator<Youku> AscDurRevCreationDate =
      Comparator.comparing(Youku::getDuration)
          .reversed()
          .thenComparing(Youku::getDateCreation)
          .reversed();
public static final Comparator<Youku> AscDurRevCreationDate =
      Comparator.comparing(Youku::getDuration)
          .reversed()
          .thenComparing(Youku::getDateCreation)
          .reversed();

下面的代码是我试图将其转换为的代码。但是,我从下面的代码中得到了一些不同的结果。顺便说一句,我在这里使用 Duration 对象。

@Override
  public int compare(Youku obj1, Youku obj2) {
    Integer duration = obj1.getDuration().compareTo(obj2.getDuration());
    Integer dateCreation = obj2.getDateCreation().compareTo(obj1.getDateCreation());

    return duration.compareTo(dateCreation );
  }

回答

解释

看着你的Comparator

您想Youku按持续时间 ( getDuration)比较s ,降序而不是升序 ( reversed()),如果两个持续时间相等,则按创建日期 ( getDateCreation) 降序打破联系。

正确的Comparable实现如下:

@Override
public int compareTo(Youku other) {
    int durationResult = Integer.compare(getDuration(), other.getDuration());
    durationResult *= -1; // for reversed

    if (durationResult != 0) { // different durations
        return durationResult;
    }

    // break ties using creation date
    int creationDateResult = Integer.compare(getDateCreation(), other.getDateCreation());
    creationDateResult *= -1;

    return creationDateResult;
}

或紧凑:

int durationResult = -1 * Integer.compare(getDuration(), other.getDuration());
return durationResult != 0
    ? durationResult
    : -1 * Integer.compare(getDateCreation(), other.getDateCreation());

基于比较器

或者,您也可以根据Comparator您已有的方法实现该方法:

public static final Comparator<Youku> comparator =
    Comparator.comparing(Youku::getDuration)
      .reversed()
      .thenComparing(Youku::getDateCreation)
      .reversed();

...

@Override
public int compareTo(Youku other) {
   return comparator.compare(this, other);
}

笔记

您的代码尝试没有显示Comparable实现,而是Comparator. 我想你在那里混淆了一些东西。


以上是如何将Comparator转换为比较?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>