6

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

如果我有一个Person带有name,agesalary字段的类,并且我将 100 个新的 this 实例Person放在一个ArrayList, 然后 doCollections.sort(list)中,那么列表将根据什么参数进行排序?

我知道我需要让Person类实现Comparable然后覆盖compareTo,但如果我不这样做,会发生什么?

4

4 回答 4

13

它不会编译:1 参数版本Collections.sort需要一个Comparables 列表。具体来说,一个List<T>whereT实现Comparable<? super T>

于 2013-07-02T17:56:04.293 回答
5

是的,您可以在不使元素实现 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) 方法后列表中的排序

于 2013-07-02T18:01:48.360 回答
3

正如 Collections API 所述:

public static <T extends Comparable<? super T>> void sort(List<T> list)

根据其元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素必须相互可比较(即,e1.compareTo(e2) 不得为列表中的任何元素 e1 和 e2 抛出 ClassCastException)。

于 2013-07-02T17:59:49.117 回答
0

如果Person类没有实现Comparable<Person>,那么(编译器会通知你):

sort(List<T>)绑定不匹配:类型的泛型方法Collections不适用于 arguments (List<Person>)。推断的类型Person不是有界参数的有效替代品<T extends Comparable<? super T>>

(如果你碰巧有一个Comparator<Person>躺着,Collections.sort(myList, myComparator)会按比较器指定的顺序对其进行排序。)

于 2013-07-02T18:02:16.207 回答