collections.sort中对象o1,o2的含义是什么?以及为什么他没有写过程而不是对象,因为我们的列表是基于过程对象的
public static void sortremaning(ArrayList<Process> L) {
Collections.sort(L, (Object o1, Object o2) -> {
if (((Process) o1).getRemaningtime() == ((Process) o2).getRemaningtime()) {
return 0;
} else if (((Process) o1).getRemaningtime() < ((Process) o2).getRemaningtime()) {
return -1;
} else {
return 1;
}
});
}
当您转向排序方法的javadoc时,您会发现它接受Comparator<? super T> c
作为参数。
Object
是Process
的超类型,因此给出的示例是正确的java代码。
现在:根据您的需求,可能有一个有效的理由来实际使用超类型,但不是在这里:给定的示例实际上可以直接使用Process
,这将允许在lambda的主体中删除类型强制转换。
(Object o1, Object o2)
引用了Comparator::compareTo
方法的参数,但应使用Process
类型而不是Object,以避免重复强制转换。
此外,根据Process::getRemaningTime
的类型,该方法的主体可以显著减少。
假设getRemaningTime
返回一个长值,则代码可以重写为:
public static void sortremaning(ArrayList<Process> L) {
Collections.sort(L, (p1, p2) -> Long.compareTo(p1.getRemaningTime(), p2.getRemaningTime()));
}
// or even simpler
public static void sortRemaning(ArrayList<Process> L) {
Collections.sort(L, Comparator.comparingLong(Process::getRemaningTime));
}
在一般情况下,getRemaningTime
返回的值应该是Comparable
类型,然后可以更新该方法以使用Comparator.comparing(Function<? super T,? extends U> keyExtractor)
:
public static void sortRemaning(List<Process> list) {
Collections.sort(list, Comparator.comparing(Process::getRemaningTime));
}