【问题标题】:what is the meaning of object here in collections.sort?collections.sort 中的对象是什么意思?
【发布时间】:2022-01-17 04:15:15
【问题描述】:

collections.sort 中的对象 o1,o2 是什么意思?以及为什么他没有写 Process 而不是 object 因为我们的列表是基于 process 对象的

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;
        }
    });
}

【问题讨论】:

  • 为什么不试试呢?将Object 替换为Process 并检查它是否有效。

标签: java object arraylist collections


【解决方案1】:

当您查看 sort 方法的 javadoc 时,您会发现它接受 Comparator&lt;? super T&gt; c 作为参数。

Object 是 Process 的超类型,因此给出的示例是正确的 java 代码。

现在:根据您的要求,可能有一个实际使用超类型的正当理由,但不是在这里:给定的示例实际上可以直接使用Process,这将允许在正文中删除类型转换的 lambda。

【讨论】:

    【解决方案2】:

    (Object o1, Object o2) 指的是Comparator::compareTo 方法的参数,但是应该使用Process 类型而不是Object 以避免冗余转换。

    此外,根据Process::getRemaningTime 的类型,方法的主体可能会显着减少。

    假设getRemaningTime返回一个long值,代码可以改写为:

    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&lt;? super T,? extends U&gt; keyExtractor):

    public static void sortRemaning(List<Process> list) {
        Collections.sort(list, Comparator.comparing(Process::getRemaningTime));
    }
    

    【讨论】:

    • ...然后,Collections.sort(list, …) 可以替换为list.sort(…)
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多