我在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>
我该如何解决这个问题?
答案 0 :(得分:0)
根据元素的自然顺序,将指定列表按升序排序。 列表中的所有元素都必须实现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时,您可能会遇到几个问题,因为您可以将所有内容添加到此列表中。