如何解决如何将 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 举报,一经查实,本站将立刻删除。