微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 Comparator 转换为比较?

如何解决如何将 Comparator 转换为比较?

这是我想要获取代码

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

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

您想按持续时间 (Youku)、降序而非升序 (getDuration) 比较 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 的手动实现。我想你在那里混淆了一些东西。

,

看着您的原始要求,我不得不指出,指定 #%%timeit import random m = _max = 10000 n = random.randint(1,m) outer = random.sample(population=range(1,2*n+1),k=2*n) inner = random.sample(population=range(1,n+1),k=n) print(f"outer is {outer}") print(f"inner is {inner}") print(outer.remove) print(list(map(outer.remove,inner))) --- outer is [11,3,1,5,12,9,8,4,10,6,7,2] inner is [1,2] <built-in method remove of list object at 0x7f470b6fbd00> [None,None,None] 会颠倒 all 先前指定的排序顺序的所需顺序。因此,假设所有的默认升序排序顺序如下:

reversed()

首先按持续时间的升序排序,然后按创建的降序排序,因为第二个 public static final Comparator<Youku> comparator = Comparator.comparing(Youku::getDuration) .reversed() .thenComparing(Youku::getDateCreation) .reversed(); 与前面的顺序相反。因此,要按降序对两者进行排序,请删除第一个 reversed()

假设您想按升序按持续时间排序,但按降序按创建排序。那么你可以这样做。

reversed()

public static final Comparator<Youku> comparator = Comparator.comparing(Youku::getDuration) .thenComparing(Youku::getDateCreation,Comparator.reversedOrder()); 只影响当前的排序模式。

如果您想查看一个简单的示例,请查看以下内容。您可以调整比较器以查看不同的结果。

Comparator.reverseOrder()

印刷品

int[][] vals = { { 30,6 },{ 40,7 },8 },{ 10,1 },2 },{ 20,3 },4 },{ 30,5 },{ 50,9 },10 },{ 60,11 },12 } };


// ascending first,descending second
Comparator<int[]> comp =
        Comparator.comparing((int[] a) -> a[0])
                .reversed()
        .thenComparing(a -> a[1])
                .reversed();

Arrays.sort(vals,comp);
for(int[] v : vals) {
    System.out.println(Arrays.toString(v));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。