Java在对ArrayList使用Comparable排序时的问题

首先用Arraylist<object>创建一个studentList,里面加入数个student对象,每个studetn都包含名字成绩专业等等,要求用Comparable按照先按名字再按成绩排序。
我已经对student类 implements Comparable<Object>,也在student类里写了compareTo方法,但是用Collections.sort(studentList)时eclipse总是提示The method sort(List<T>) in the type Collections is not applicable for the arguments(StudentList).
请问
1. 如何才能正确用Comparable排序?
2. Collections.sort()里的这个(List<T> list)的<T>是什么意思? ArrayList难道不是List接口里的吗?

T表示泛型的意思,就是编译器直到运行期间才知道具体是什么类型。编译的时候是不知道他到底是什么类型的。
你的错误应该是你在泛型的时候使用不当造成的,这里没代码所以也不好说你错在那里了,你可以看看这个地方:http://whitesock.javaeye.com/blog/185692
关于排序问题。
public static <T extends Comparable<? super T>> void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
这个只要你的排序对象实现了Comparable接口就可以了,不过通常都是和同一类比较,比如你的Student的类只要implements Comparable<Student>,这样就可以了,因为你排序是只会和Student类对象来比较的,不可能拿一个其他的类来和学生比较的。而且你定义了泛型的list也是不能装其他的类型的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-11-29
那是泛型,也就是说List集合里只能存放T的实例(对象)User
u
=
new
User();List<User>
list
=
new
ArrayList<User>();list.add(u);----------------如果添加其他对象就会报错!
第2个回答  2010-02-04
你的错误在于用Arraylist<object>来创建的studentList,而用Collections.sort()来对这个List排序,我们知道,Collections.sort()此方法的参数应该是一个实现了Comparable接口的对象集合,而Object没有实现Comparable接口,所以程序编译都应该有问题。

解决的方法: 用List<Student> studentList = new ArrayList<Student>();声明即可
第3个回答  2010-02-04
一》
Comparable

强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。

接口方法:

/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
*/
int compareTo(Object o);

假设对象User,需要按年龄排序:

public class User {

private String id;
private int age;

public User(String id, int age) {
this.id = id;
this.age = age;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

}
改造后的对象:

import java.util.Arrays;

public class User implements Comparable {

private String id;
private int age;

public User(String id, int age) {
this.id = id;
this.age = age;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public int compareTo(Object o) {
return this.age - ((User) o).getAge();
}

/**
* 测试方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("a", 30), new User("b", 20) };
Arrays.sort(users);
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}

}

二》
List是接口,List特性就是有序,会确保以一定的顺序保存元素.
ArrayList是它的实现类,是一个用数组实现的List.

List<T> list
<T>这个是泛型,意思是List里装的是哪种对象
可以不写泛型,eclipse会提示黄色的警告
这不是错误~

指定泛型后List不需要转型了~

java编程中对list集合进行排序的问题?
首先,定义学生类并实现Comparable接口。学生类应能比较大小,通常基于计算机考试成绩和笔试成绩。方法实现逻辑:如果计算机考试成绩相同,则以笔试成绩确定顺序。学生类代码示例:java public class Student implements Comparable { private int computerBasedScore;private int paperBasedScore;\/\/ 构造函数、getter...

java 两个arraylist放着相同的东西,但顺序不同,怎么判断两个是否相等...
相等条件:相互包含,且长度相等,和相等 boolean result = list1.containsAll(list2) && list2.containsAll(list1) && list1.size() == list2.size() && list1.stream().mapToInt(x -> x).sum() ==list2.stream().mapToInt(x -> x).sum();...

java arraylist 按照对象的属性排序
List中的元素是对象的话,若要按该List中元素的某个属性进行排序,那么应该重写里面元素的hashCode和equals方法,然后再排序。比如该问题要重写course的hashCode和equals方法

java Comparable接口
-1和1排序是相反的,哪个是从大到小,哪个是从小到大不是很清楚 用这种好点List list=new ArrayList()来自知道:我百度的 第一种定义,是很好的面向接口编程的习惯。比如你有这么一个方法供别人调用:public List getXXXList(){ List list = new ArrayList();...return list;} 现在是new ArrayL...

java如何对ArrayList中对象按照该对象某属性排序
有几个方法可以实现:让 Student 实现Comparable接口,或是实例化一个比较器,现在用 Comparator 比较器实例来做一个:ComparableTest.java import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class ComparableTest { public static void main(String[] args) { Co...

java中用到ArrayList.sort()为什么会出现“使用了未经检查或不安全的...
存在类型匹配隐患,在个人用一般没问题,自己能确认类型无误,在main()上面加@SuppressWarnings("unchecked")就行 要是给别人用或者教常用和可能以后需要扩展,还是改了好。1,.Student类的定义改为class Student implements Comparable<Student> 2.类中的方法改为 public int compareTo(Student s) { ret...

用Java中ArrayList类实现一个冒泡排序
java.util.Collections类中有 sort public static <T extends Comparable<? super T>> void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,...

java list排序出错
并没有出错.你使用了Collections.sort对List进行了自然排序,也就是升序排序.由于比较的对象是String,所以应该按字符的Unicode值进行排序.比如说"abd","ace","bdr"要进行sort排序的话,比较字符的Unicode值. 应该是这样的"abd","ace","bdr". (和原顺序一样)因为a在字典查询顺序中排在最前面,其次是...

Java中的ArrayList怎么进行冒泡排序
java中的ArrayList进行冒泡排序,主要是循环遍历取出数据,然后进行比较排序,如下代码:package com.qiu.lin.he;import java.util.ArrayList;public class Ceshi {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<Integer>();list.add(76);list.add(4);list.add(...

java中用Comparator接口实现的类,运行时出现问题
TreeSet是JDK实现好了的排序的集合类,他默认按照ASCII来排序,你的Student要想放在TrseSet里面就要实现comparable接口,来制定你的Student类来按什么逻辑排序,不然的话TreeSet怎么知道你是按什么逻辑排序的呢。他默认按ASCII排序,但是你的Student类没有实现排序逻辑,TreeSet当然不知道怎么给你排序了。

相似回答