Java Sort with Comparable

use*_*972 4 java inheritance arraylist comparable

我有一个ArrayListPerson对象。APersonnameageheight。我的目标是对此进行排序ArrayList<Person>。我已经实现Comparable<Person>并定义了compareTo()但是当我尝试对其进行排序时,它给了我这个错误:

ArrayList 类型中的 sort(Comparator) 方法不适用于参数 ()"

我的理解是,如果你实现了 Comparable,然后定义了compareTo所有其他的东西,你就可以神奇地完成了。

有人可以解释一下这是如何工作的以及为什么我会收到此错误吗?

sli*_*lim 6

我的猜测是您的代码如下所示:

ArrayList<Person> people = ...;
people.sort();
Run Code Online (Sandbox Code Playgroud)

查看 JavaDoc for ArrayList. 你看到一个方法public void sort()(没有参数)吗?- 没有这样的方法。

这就是错误的含义:The method sort(Comparator) in the type ArrayList is not applicable for the argument ()--有一个方法sort(Comparator),但您没有提供与之匹配的参数。

假设Person实现Comparable(因此有一个compareTo()方法),您可以使用Collections.sort(),它可以任意排序List<Comparable>

Collections.sort(people);
Run Code Online (Sandbox Code Playgroud)

这是因为Collections有一个静态方法:

static <T extends Comparable<? super T>> void sort(List<T> list);
Run Code Online (Sandbox Code Playgroud)

(它也有一个sort(List<T> list, Comparator<T> comparator)

...或者您可以将比较器传递给List.sort(),这对于 Java 8 lambdas 来说非常容易:

people.sort((a,b) -> a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)

(或者,如果您更喜欢旧样式):

people.sort(new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.compareTo(b);
    }
});
Run Code Online (Sandbox Code Playgroud)

(实际上从 Java 8 开始,此比较器由标准库提供,如Comparator.naturalOrder()

比较器的要点是您可以根据不同的标准进行排序。例如:

people.sort((a,b) -> a.lastName().compareTo(b.lastName()));
people.sort((a,b) -> a.lastName().compareToIgnoreCase(b.lastName()));
people.sort((a,b) -> Integer.compare(a.age(),b.age()));
// etc.
Run Code Online (Sandbox Code Playgroud)

...或使用方法Comparator

people.sort(Comparator.comparing(Person::lastName));
people.sort(Comparator.comparing(Person::lastName)
        .thenComparing(Person::firstName));
Run Code Online (Sandbox Code Playgroud)


dav*_*xxx 2

要么使用一个结构,Comparable当您在其中添加新元素时,该结构使用接口对其元素进行排序:

TreeSet<Person> persons = new TreeSet<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
Run Code Online (Sandbox Code Playgroud)

您可以使用 aListCollections.sort(List<T> list)将要排序的列表作为参数的方法(此方法有重载,但与您的情况无关):

List<Person> persons = new ArrayList<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
Collections.sort(persons);
Run Code Online (Sandbox Code Playgroud)

使用 时TreeSet,元素在添加后立即排序,而使用 时List,元素在添加时不会排序。
只是,对该Collections.sort()方法的调用会对列表进行排序。