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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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也是不能装其他的类型的。
参考技术A 那是泛型,也就是说List集合里只能存放T的实例(对象)User
u
=
new
User();List<User>
list
=
new
ArrayList<User>();list.add(u);----------------如果添加其他对象就会报错!
参考技术B 你的错误在于用Arraylist<object>来创建的studentList,而用Collections.sort()来对这个List排序,我们知道,Collections.sort()此方法的参数应该是一个实现了Comparable接口的对象集合,而Object没有实现Comparable接口,所以程序编译都应该有问题。

解决的方法: 用List<Student> studentList = new ArrayList<Student>();声明即可
参考技术C 一》
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不需要转型了~

遍历list进行remove操作异常

参考技术A 产生问题:

在对list增强for循环进行遍历的时候,如果在不恰当的位置使用了remove,就会产生ConcurrentModificationException异常

产生原因:

java的foreach循环其实就是根据list对象创建一个Iterator迭代对象,然后针对Iterator进行遍历.遍历过程中会调用对应的hasNext和next方法

(1)ArrayList的hasnext和next 方法

   (2)LinkedList的hasnext和next 方法

两种list的iterator 都有一个方法是checkForComodification,目的是校验是否list被修改过。list中有个属性是modCount,记录着操作修改list的属性,如果操作list的add或remove,modCount属性都会进行+1的操作。

如果发生了修改,那么在下一次执行到这一步校验的时候,就会发现两个值不相等,抛出异常。

以上是关于Java在对ArrayList使用Comparable排序时的问题的主要内容,如果未能解决你的问题,请参考以下文章

暑假周进度报告3

遍历list进行remove操作异常

java 的sort方法

ArrayList的subList方法带来的坑

Day029 Java比较器

java.util.ConcurrentModificationException故障分析