使用Collections.sort对Object ArrayList进行排序

时间:2015-09-18 12:04:44

标签: java arraylist collections compareto

我在Integer对象类型中添加了一些ArrayList,并希望对其进行排序。我的代码如下:

List<Object> list = new ArrayList<Object>(); 

list.add(24);
list.add(2);
list.add(4);

Collections.sort(list);  // getting error here

System.out.println("Sorted list  ");

for (Object e : list) {
    System.out.println(e);
}

我收到了以下编译时错误:

error  : should implement java.lang.Compareble <? super java.lang.Object>

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

来自sort() method docs

  

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

IDE生成的错误消息

  

推断类型Object不是有界参数&gt;

的有效替代

这意味着放在该List中的对象必须在sort()方法中实现Comparable接口才能接受。

Object类没有实现类似的接口,因此你看到了错误。

不建议在Generic中使用Object类型,并使用特定类型。由于您要将所有整数添加到列表中,只需将声明更改为

即可
List<Object> intList = new ArrayList<Object>(); 

如果您拥有自己类型的任何其他对象,只需在该类中实现类似的接口,或者将自定义比较器作为第二个参数进行排序。

答案 1 :(得分:0)

不是执行Collections.sort(list),而是循环遍历数组并将对象从最小到最大排序。

你可以这样做:

for(int i = 0; i < intList.size(); i++) {

// if an integer is larger than any of the ones after it in the array, switch them.

}

答案 2 :(得分:0)

由于您已将列表声明为类型List<Object>,因此您可以将任何内容存储在其中,无论是否具有可比性。

泛型方法Collections.sort(List)有一个类型签名,要求您的列表具有实现Comparable接口的元素类型,这确保所有元素可以相互比较,并告诉sort方法如何比较这些元素,因为interface包含method which can be called to compared two elements。换句话说,它不接受可能包含任何内容的List

您的情况也是如此,您应该将声明更改为

List<Integer> list = new ArrayList<>();

因为您只添加Integer个对象。 Integer是一种实现Comparable的类型,因为整数值具有自然顺序。

请注意,您可以简化代码:

List<Integer> list = Arrays.asList(24, 2, 4);
Collections.sort(list);
System.out.println("Sorted list "+list);

Arrays.asList返回的列表不支持更改其大小,但支持重新排序元素,因此您可以对该列表进行排序。

作为旁注,在极少数情况下,您有一个List<Object>类型,您无法更改,但您确定它只包含自然可以相互比较的元素,您可以规避Collection.sort的类型约束:

Collections.sort(list, null);

方法Collections.sort(List, Comparator)支持任意元素类型,因为第二个参数告诉如何比较它们。作为一种特殊情况,null的比较器强制自然顺序,但null通过每种类型检查。但是,当然,当关于元素的假设是错误的时候,使用这个技巧会适得其反。

通常,应确保在compile-type中声明的元素类型适合所需的操作。在这里,当列表包含List<Integer>时,使用Integer是正确的方法。

答案 3 :(得分:-1)

Object类没有实现Comperable接口,因此它会给你这个错误。您应该将其定义为List<Integer>,或者定义一个自定义的comperator类并将其作为aditional Argument传递。

public class Comp<T> implements Comparator<T>{

   @Override
   public int compare(T o1, T o2) {
       if(o1 instanceof Integer && o2 instanceof Integer) {
          int a = (Integer) o1;
          int b = (Integer) o2;
          return a-b;
       }
       return 0;
   }

}

// Call it as 
Collections.sort(list, new Comp<Object>());

但是在使用对象列表和自定义Comperator时,您可能会遇到几个问题,因为您可以将所有内容添加到此列表中。