collections.sort中object的含义是什么



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作为参数。

ObjectProcess的超类型,因此给出的示例是正确的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));
}

最新更新