今天被问到这个面试问题:
如果我有一个
Person
带有name
,age
和salary
字段的类,并且我将 100 个新的 this 实例Person
放在一个ArrayList
, 然后 doCollections.sort(list)
中,那么列表将根据什么参数进行排序?
我知道我需要让Person
类实现Comparable
然后覆盖compareTo
,但如果我不这样做,会发生什么?
今天被问到这个面试问题:
如果我有一个
Person
带有name
,age
和salary
字段的类,并且我将 100 个新的 this 实例Person
放在一个ArrayList
, 然后 doCollections.sort(list)
中,那么列表将根据什么参数进行排序?
我知道我需要让Person
类实现Comparable
然后覆盖compareTo
,但如果我不这样做,会发生什么?
它不会编译:1 参数版本Collections.sort
需要一个Comparable
s 列表。具体来说,一个List<T>
whereT
实现Comparable<? super T>
。
是的,您可以在不使元素实现 Comparable Interface 的情况下对集合进行排序,您可以这样做
List<YourType> theList = new ArrayList<>();
Collections.sort(theList, new Comparator<YourType>(){
public int compare(YourType obj1, YourType obj2) {
// this method should return < 0, 0 or > 0
// whether obj1 is less than, equal to
// or greather than obj2
return 0;
}
});
/编辑,
如果你使用 Collections.sort(List) 那么它只会在列表是通用的并且它的元素实现 Comparable 时编译。如果是这样,那么在每个元素上执行 compareTo(Obj) 将确定调用 sort(List) 方法后列表中的排序
正如 Collections API 所述:
public static <T extends Comparable<? super T>> void sort(List<T> list)
根据其元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素必须相互可比较(即,e1.compareTo(e2) 不得为列表中的任何元素 e1 和 e2 抛出 ClassCastException)。
如果Person
类没有实现Comparable<Person>
,那么(编译器会通知你):
sort(List<T>)
绑定不匹配:类型的泛型方法Collections
不适用于 arguments(List<Person>)
。推断的类型Person
不是有界参数的有效替代品<T extends Comparable<? super T>>
。
(如果你碰巧有一个Comparator<Person>
躺着,Collections.sort(myList, myComparator)
会按比较器指定的顺序对其进行排序。)