[英]Sorting a list of non-comparable elements
今天我被问到这个面试问题:
如果我有一个带有
name
,age
和salary
字段的Person
类,并且我在ArrayList
放置了100个这个Person
新实例,然后执行Collections.sort(list)
,那么列表将被排序的参数是什么?
我知道我需要让Person
类实现Comparable
,然后覆盖compareTo
,但如果我不这样做,会发生什么?
它不会编译: Collections.sort
的1参数版本需要一个Comparable
列表。 具体来说,一个List<T>
,其中T
实现了Comparable<? super T>
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>
,那么(因为编译器会通知你):
绑定不匹配:类型
Collections
的泛型方法sort(List<T>)
不适用于参数(List<Person>)
。 推断类型Person
不是有界参数的有效替代<T extends Comparable<? super T>>
<T extends Comparable<? super T>>
。
(如果碰巧有Comparator<Person>
, Collections.sort(myList, myComparator)
会按比较器指定的顺序对其进行排序。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.