0Pricing
Java Academy · 课时

Comparable 与 Comparator

了解 Comparable 与 Comparator 在自定义排序中的区别。练习 compareTo 和外部 Comparator。

Comparable 与 Comparator 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 3 节课。

简介

排序需要规则。Comparable和Comparator是定义规则的两种方式:

  • Comparable:类实现 compareTo。
  • Comparator:传递给 sort() 的独立对象。

Comparable 概念

Comparable允许类定义自己的自然顺序。请实现compareTo,这样 Collections.sort 才知道如何排列元素。

代码:Comparable

这里的Person实现了 Comparable,并按照年龄排序。这定义了它的自然顺序。

public class Main {
  static class Person implements Comparable<Person> {
    String name;
    int age;
    Person(String n, int a) { name = n; age = a; }
    public int compareTo(Person o) {
      return this.age - o.age; // order by age
    }
    public String toString() { return name + "(" + age + ")"; }
  }
  public static void main(String[] args) {
    java.util.List<Person> list = new java.util.ArrayList<>();
    list.add(new Person("Ada",30));
    list.add(new Person("Bob",25));
    java.util.Collections.sort(list);
    System.out.println(list); // [Bob(25), Ada(30)]
  }
}

Comparator 概念

Comparator是外部对象。它可以用不同方式为同一个类排序,例如按名称而不是按年龄排序。

代码:Comparator

这个 Comparator 按名称排序。不同的 Comparator 可以在同一个类上重复使用。

public class Main {
  static class Person {
    String name; int age;
    Person(String n,int a){ name=n; age=a; }
    public String toString(){ return name+"("+age+")"; }
  }
  public static void main(String[] args) {
    java.util.List<Person> list = new java.util.ArrayList<>();
    list.add(new Person("Ada",30));
    list.add(new Person("Bob",25));

    java.util.Comparator<Person> byName = (p1,p2) -> p1.name.compareTo(p2.name);
    java.util.Collections.sort(list, byName);
    System.out.println(list); // [Ada(30), Bob(25)]
  }
}

代码:反向 Comparator

比较器可以定义任何规则,例如这里定义的降序排列。

public class Main {
  public static void main(String[] args) {
    java.util.List<Integer> nums = new java.util.ArrayList<>();
    nums.add(5); nums.add(1); nums.add(3);

    java.util.Comparator<Integer> desc = (a,b) -> b - a;
    java.util.Collections.sort(nums, desc);
    System.out.println(nums); // [5,3,1]
  }
}

Comparable 与 Comparator 检查

快速检查:Comparable 和 Comparator 的主要区别是什么?

回顾

回顾:Comparable 在类内部定义自然顺序。Comparator 是独立的,可以创建多种排序策略。

常见问题解答

「Comparable 与 Comparator」课时是免费的吗?

是的 — 「Comparable 与 Comparator」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 3 节课。

「Comparable 与 Comparator」这节课中我会学到什么?

了解 Comparable 与 Comparator 在自定义排序中的区别。练习 compareTo 和外部 Comparator。 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「Comparable 与 Comparator」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 映射与频次统计
  2. Comparable 与 Comparator
  3. 使用 Collections 排序与搜索
← 返回 Java Academy