Java在对ArrayList使用Comparable排序时的问题
首先用Arraylist<object>创建一个studentList,里面加入数个student对象,每个studetn都包含名字成绩专业等等,要求用Comparabl...
首先用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接口里的吗? 展开
我已经对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接口里的吗? 展开
4个回答
展开全部
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也是不能装其他的类型的。
你的错误应该是你在泛型的时候使用不当造成的,这里没代码所以也不好说你错在那里了,你可以看看这个地方: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也是不能装其他的类型的。
展开全部
那是泛型,也就是说List集合里只能存放T的实例(对象)User
u
=
new
User();List<User>
list
=
new
ArrayList<User>();list.add(u);----------------如果添加其他对象就会报错!
u
=
new
User();List<User>
list
=
new
ArrayList<User>();list.add(u);----------------如果添加其他对象就会报错!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的错误在于用Arraylist<object>来创建的studentList,而用Collections.sort()来对这个List排序,我们知道,Collections.sort()此方法的参数应该是一个实现了Comparable接口的对象集合,而Object没有实现Comparable接口,所以程序编译都应该有问题。
解决的方法: 用List<Student> studentList = new ArrayList<Student>();声明即可
解决的方法: 用List<Student> studentList = new ArrayList<Student>();声明即可
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一》
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不需要转型了~
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不需要转型了~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询