Java排序与可比较

时间:2016-12-19 15:50:52

标签: java inheritance arraylist comparable

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

  

ArrayList类型中的方法sort(Comparator)不适用于参数()&#34;

我理解的方法是,如果你实现了Comparable,然后定义compareTo,那么其他一切都是神奇地为你完成的。

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

2 个答案:

答案 0 :(得分:2)

我猜你的代码是这样的:

ArrayList<Person> people = ...;
people.sort();

查看ArrayList的JavaDoc。您是否看到方法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);

这是因为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));

答案 1 :(得分:0)

使用Comparable接口的结构在其中添加新元素时对其元素进行排序:

TreeSet<Person> persons = new TreeSet<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);

您使用ListCollections.sort(List<T> list)方法,该方法将您要排序的列表作为参数(此方法存在重载但在您的情况下不相关):

List<Person> persons = new ArrayList<>();
Person personOne = ...
Person personTwo = ...
persons.add(personOne);
persons.add(personTwo);
Collections.sort(persons);

使用TreeSet,元素会在添加后立即排序,并且List会对元素进行排序。添加元素时,元素不会排序。
仅限于调用{{ 1}}方法对列表进行排序。