如何将Comparator转换为compare?



这是我想要得到的代码。

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的

或者,您也可以基于您已经拥有的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的手动实现。我想你搞混了什么。

看看你最初的要求,我觉得有必要指出指定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 }, { 40, 8 }, { 10, 1 },
{ 10, 2 }, { 20, 3 }, { 20, 4 }, { 30, 5 }, { 50, 9 },
{ 50, 10 }, { 60, 11 }, { 60, 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));
}

打印

[10, 2]
[10, 1]
[20, 4]
[20, 3]
[30, 6]
[30, 5]
[40, 8]
[40, 7]
[50, 10]
[50, 9]
[60, 12]
[60, 11]

最新更新