繁体   English   中英

排序不可比较的元素列表

[英]Sorting a list of non-comparable elements

今天我被问到这个面试问题:

如果我有一个带有nameagesalary字段的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM