List集合的两种排序方法--自然排序和定制排序

文章目录

      • 1.几种常见的排序
      • 2. java.util包下的Collections.sort() 排序
      • 3. 自然排序,实现Comparable<>接口
      • 4. 定制排序,实现Comparator<>接口
          • 定制排序接口类 MyComparator.java
          • 实体类 Student.java
          • 测试类Test.java:

1.几种常见的排序

回忆起初学java时,有几个经典的排序算法,比如“冒泡”,“选择”,“快速”等排序。

  1. 冒泡排序(Bubble Sort):它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。
  2. 选择排序(Selection sort):每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
  3. 快速排序(Quicksort):是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2. java.util包下的Collections.sort() 排序

		//String 类型集合的排序
        List<String> string = new ArrayList<String>();
        string.add("a");
        string.add("c");
        string.add("b");
        Collections.sort(string);
        System.out.println("string:" + string);

		//Integer类型集合的排序
        List<Integer> num = new ArrayList<Integer>();
        num.add(5);
        num.add(3);
        num.add(4);
        Collections.sort(num);
        System.out.println("num:" + num);

在这里插入图片描述

3. 自然排序,实现Comparable<>接口

当定义的的集合类型本身不支持比较的时候,可以使引用的类型实现Comparable<>接口,重写compareTo()方法,经过比较(二叉树排序),根据返回值进行排序

  • 1,降序
  • -1,升序
  • 0,不做比较

比如,有下面一个自定义类型的集合List

        List<Student> stu = new ArrayList<Student>();
        stu.add(new Student("sy1", 15));
        stu.add(new Student("sy2", 10));
        stu.add(new Student("sy3", 5));
        stu.add(new Student("sy4", 15));
        //排序
        Collections.sort(stu);
        //打印
        System.out.println(stu);     
  • 提示要实现"java.lang.Comparable<>"接口
    List集合的两种排序方法--自然排序和定制排序_第1张图片
class Student implements Comparable<Student> {
    private String name;
    private int age;

	//根据年龄排序,原先的顺序是15、10、5、15,先是10:15,返回1。
    public int compareTo(Student o) {
        System.out.println(this.name + "," + o.name);
        if (this.age > o.age) {
            return -1;
        } else if (this.age < o.age) {
            return 1;
        } else {
            return 0;
        }
    }
	//getter 和 setter 及构造器略
	...
    }
  • 测试结果:
    List集合的两种排序方法--自然排序和定制排序_第2张图片
    可以看出,返回1的时候,10排到15后边去了,证明是返回1是降序排列。

4. 定制排序,实现Comparator<>接口

如果引用的实体类已经定义好了,没有实现Comparable<>接口,且不能修改。则可以采用定制排序实现排序。

定制排序接口类 MyComparator.java
public class MyComparator implements Comparator<Student> {
   public int compare(Student o1,Student o2) {
       //o1 是比较目标,o2是原对象
       System.out.println(o1.getName() + "," + o2.getName());
       if (o1.getAge() > o2.getAge()) {
           return -1;
       } else if (o1.getAge() < o2.getAge()) {
           return 1;
       } else {
           return 0;
       }
   }
}
实体类 Student.java
public class Student {
    private String name;
    private int age;
	//getter setter 、构造器省略
	...
测试类Test.java:
       List<Student> stu = new ArrayList<Student>();
      stu.add(new Student("sy1", 15));
      stu.add(new Student("sy2", 10));
      stu.add(new Student("sy3", 5));
      stu.add(new Student("sy4", 15));
      //传入new MyComparator()对象当作参数
      Collections.sort(stu,new MyComparator());
      System.out.println(stu);

运行结果: List集合的两种排序方法--自然排序和定制排序_第3张图片

你可能感兴趣的:(java,算法)