Java 可比排序
Java Sort with Comparable
我有 ArrayList
个 Person
个对象。 Person
有 name
、age
和 height
。我的目标是对 ArrayList<Person>
进行排序。我已经实现了 Comparable<Person>
并定义了 compareTo()
但是当我尝试对它进行排序时,它给我这个错误:
The method sort(Comparator) in the type ArrayList is not applicable for the argument ()"
我的理解是,如果你实现 Comparable 然后定义 compareTo
其他一切都为你神奇地完成了。
谁能解释一下这是如何工作的以及为什么我会收到此错误?
当您在其中添加新元素时,您可以使用使用 Comparable
接口对其元素进行排序的结构:
TreeSet<Person> persons = new TreeSet<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
要么使用 List
和 Collections.sort(List<T> list)
方法,后者将要排序的列表作为参数(此方法有重载,但与您的情况无关):
List<Person> persons = new ArrayList<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
Collections.sort(persons);
使用TreeSet
,元素一添加就排序,使用List
,元素添加时不排序。
仅调用Collections.sort()
方法对列表进行排序。
我猜你的代码是这样的:
ArrayList<Person> people = ...;
people.sort();
查看 JavaArrayList
的文档。你看到一个方法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>
[=31 进行排序=]
Collections.sort(people);
这是因为Collections
有一个静态方法:
static <T extends Comparable<? super T>> void sort(List<T> list);
(它还有一个sort(List<T> list, Comparator<T> comparator)
)
... 或者您可以将比较器传递给 List.sort()
,这对于 Java 8 lambdas 非常容易:
people.sort((a,b) -> a.compareTo(b));
(或者,如果您喜欢旧样式):
people.sort(new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
(实际上从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.
... 或使用 Comparator
:
中的方法
people.sort(Comparator.comparing(Person::lastName));
people.sort(Comparator.comparing(Person::lastName)
.thenComparing(Person::firstName));
我有 ArrayList
个 Person
个对象。 Person
有 name
、age
和 height
。我的目标是对 ArrayList<Person>
进行排序。我已经实现了 Comparable<Person>
并定义了 compareTo()
但是当我尝试对它进行排序时,它给我这个错误:
The method sort(Comparator) in the type ArrayList is not applicable for the argument ()"
我的理解是,如果你实现 Comparable 然后定义 compareTo
其他一切都为你神奇地完成了。
谁能解释一下这是如何工作的以及为什么我会收到此错误?
当您在其中添加新元素时,您可以使用使用 Comparable
接口对其元素进行排序的结构:
TreeSet<Person> persons = new TreeSet<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
要么使用 List
和 Collections.sort(List<T> list)
方法,后者将要排序的列表作为参数(此方法有重载,但与您的情况无关):
List<Person> persons = new ArrayList<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
Collections.sort(persons);
使用TreeSet
,元素一添加就排序,使用List
,元素添加时不排序。
仅调用Collections.sort()
方法对列表进行排序。
我猜你的代码是这样的:
ArrayList<Person> people = ...;
people.sort();
查看 JavaArrayList
的文档。你看到一个方法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>
[=31 进行排序=]
Collections.sort(people);
这是因为Collections
有一个静态方法:
static <T extends Comparable<? super T>> void sort(List<T> list);
(它还有一个sort(List<T> list, Comparator<T> comparator)
)
... 或者您可以将比较器传递给 List.sort()
,这对于 Java 8 lambdas 非常容易:
people.sort((a,b) -> a.compareTo(b));
(或者,如果您喜欢旧样式):
people.sort(new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
(实际上从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.
... 或使用 Comparator
:
people.sort(Comparator.comparing(Person::lastName));
people.sort(Comparator.comparing(Person::lastName)
.thenComparing(Person::firstName));