Collections工具类中的sort方法

来源:互联网 发布:java线程共享数据 编辑:程序博客网 时间:2024/04/28 10:49

1.了解Collections工具类
Collections工具类是java集合框架的成员,是一种用来操作集合对象的工具类,在Collections类中有一个sort()方法,可以对给定的集合进行排序。集合列表中所有元素都要实现Comparable接口。由于不可使用基本类型作为泛型,我们对它们相应的包装类进行操作。对以包装类为泛型的集合的排序,是根据元素的自然顺序,对指定列表按升序进行排序。

2.Comparable,Comparator接口
Comparable和Comparator接口,也是java集合框架的成员
Comparable接口给对象定义了默认的比较规则,当一个类实现了这个接口,就说明了该类的实例是可以比较大小的,可以进行自然排序。一旦类实现了Comparable接口,就必须实现compareTo()方法,当类的两个实例进行比较时,就会调用这个方法。该方法返回一个int类型的值,若为正数表示(a对像比b对象)大,负数表示小,0表示相等

Comparator-给对象定义临时的比较规则,当一个类实现了这个接口,就必须实现compare()方法,可以将comparator传递给sort方法,如Collections.sort或者Arrays.sort,也就是可以调用Collections.sort方法来使用实现接口的的具体实例。
这里要注意,在你使用这个方法以后,你的Student类(见下文代码)就不需要再实现Comparable接口了。

当使用Collections.sort对指定的集合进行排序以后,默认排序方式为升序。

3.对Integer泛型的List进行排序

public void testSort1(){    List<Integer> integerList=new ArratList<Integer>();    Random random=new Random();    Integer k;    for(inti=0;i<10;i++){        do{            k=random.nextInt(100);        }while(integerList.contains(k));//判断list中是否包含生成的这个随机数        integerList.add(k);    }    Collections.sort(integerList);}

4.对String泛型的List进行排序

public class testSort1(){    List<String> stringList=new ArrayList<String>();    stringList.add("microsoft");    stringList.add("google");    stringList.add("lenovo");    Collections.sort(stringList);}

排序结果为:google,lenovo,microsoft
这里是按照每一个字符串的首字母进行排序的,若首字母相同则比较第二个字母,这样依次比较,排列顺序是先数字(0-9),然后大写字母(A-Z),然后小写字母(a-z)

5.对其他类型泛型的List进行排序,以Student为例

public class Student implements Comparable<Student>{    String id;    String name;    public Student(int id,String name){        this.id=id;        this.name=name;    }    @Override    public int compareTo(Student o){        //按照学生id进行排序        return this.id.compareTo(o.id);    }}public class testSort3(){    List<Student> studentList =new ArrayList<Student>();    Random random=new Random();    studentList.add(newStudent(random.nextInt(1000)+"","Jack"));    studentList.add(newStudent(random.nextInt(1000)+"","RUB"));    studentList.add(newStudent(random.nextInt(1000)+"","Dog"));    Collections.sort(studentList);}

用上面的方法的比较是不严谨的,抛开获取的随机数可能会重复这个问题,如果我指定一个id为10000的同学,按照以上的方式排列,那么排列结果则会是,这位学号1000的同学排在第一位,而它本应该是排到最后的,为什么会出现这种情况呢,我们id的类型是String,那么它排序的时候还是按照一位一位的比较,比较第一位的时候,1最小,就排在了第一位。
所以这种比较方法还是应该根据实际情况进行考虑,下面我们来看看另一个接口,以及另一种实现方式。

public class Compara implements Comparator<Student>{    @Override    public int compare(Student o1,Student o2){        return o1.name.compareTo(o2.name);    }public class testSort3(){    List<Student> studentList =new ArrayList<Student>();    Random random=new Random();    studentList.add(newStudent(random.nextInt(1000)+"","Jack"));    studentList.add(newStudent(random.nextInt(1000)+"","RUB"));    studentList.add(newStudent(random.nextInt(1000)+"","Dog"));    Collections.sort(studentList,new Compara());}}
0 0
原创粉丝点击