商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何在 Java 中正确对进程对象按到达时间排序

如何在 Java 中正确对进程对象按到达时间排序

  发布于2026-07-06 阅读(0)

扫一扫,手机访问

本文详解 Ja va 中使用 Collections.sort() 和 Comparator 对进程列表按到达时间(arrivalTime)进行升序排序的正确方法,重点解决因误用 comparing() 导致的“no suitable method found for comparing(int)”编译错误。

实现FCFS(先来先服务)CPU调度算法时,第一步就是把进程列表按到达时间排好序——让最早来的进程最先被处理,这逻辑再自然不过了。但很多新手在写排序代码时,直接就踩进了坑里。

看看这段常见的错误写法:

Collections.sort(cpu, Comparator.comparing(cpu.arrivalTime));

一跑起来,编译器就甩给你一句:error: no suitable method found for comparing(int)。问题出在哪儿?Comparator.comparing()这个方法要求你传入一个返回引用类型(比如Integer、String)的函数式接口,可你直接传了个int基本类型字段——它既不是方法调用,也不返回包装类,编译器自然没法推断出合法的Function。

正确的解法其实很简单:把arrivalTime定义成类的getter方法(推荐做法),然后配合专门为基本类型优化的Comparator.comparingInt()。这样既能避免装箱开销,语义也清晰明了。

假设你的Process类是这样写的(现代Ja va推荐封装风格):

public class Process {
    private final int arrivalTime;
    private final int burstTime;
    private final int priority;
    public Process(int arrivalTime, int burstTime, int priority) {
        this.arrivalTime = arrivalTime;
        this.burstTime = burstTime;
        this.priority = priority;
    }
    // 必须提供 getter 方法(不能直接访问字段)
    public int getArrivalTime() { return arrivalTime; }
    public int getBurstTime() { return burstTime; }
    @Override
    public String toString() {
        return String.format("Process{arrival=%d, burst=%d}", arrivalTime, burstTime);
    }
}

那么对List cpu按到达时间排序,正确的写法就是:

Collections.sort(cpu, Comparator.comparingInt(Process::getArrivalTime));
// 或者用更简洁的 List.sort()(Ja va 8+ 推荐)
cpu.sort(Comparator.comparingInt(Process::getArrivalTime));

这里有几个需要特别注意的点:

  • ✅ 为什么用comparingInt() 它是专门为int、long、double等基本类型设计的重载方法,内部直接比较原始值,高效且类型安全,不会产生装箱开销。
  • ❌ 千万别这么写Comparator.comparing(p -> p.arrivalTime)(字段直取,还是int)或者Comparator.comparing(Process::arrivalTime)(语法错误,字段不能当方法引用用)。
  • ✅ 如果你用的是Ja va 14+,可以考虑用record类型进一步简化,代码更简洁、不可变、自带equals和toString:
record Process(int arrivalTime, int burstTime, int priority) {}
// 排序不变:cpu.sort(Comparator.comparingInt(Process::arrivalTime)); // record 自动生成 public accessor

再补充几个实战中的注意事项:

  • 务必确认cpuList类型(比如ArrayList),而不是数组或其他容器。
  • 如果arrivalTime是Integer包装类型而不是int(即可能为null),那就得改用Comparator.comparing(…, Comparator.nullsFirst(Integer::compareTo))来处理空值。
  • FCFS排序只需要在调度循环开始前执行一次,千万别在每次时钟推进时都重复排序,那样会影响性能。

至此,你的进程列表就已经按到达时间严格升序排列好了,接下来就可以放心地推进FCFS调度逻辑——模拟时钟、计算等待时间等,地基已经打牢。

本文转载于:https://www.php.cn/faq/2442259.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注