Java 集合排序Comparable与Comparator

一、用法

1. Comparable用法

源码如下:

public interface Comparable {
   //a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. 
   负数、0、正数 分别代表该对象 小于、等于 大于 比较对象
   public int compareTo(T o);
}

创建一个学生类如下:

public class StudentModel implements Comparable {
  private int num;//编号
  private int age;//年龄
  private String name;//姓名

  public StudentModel(int num, int age, String name) {
      this.num = num;
      this.age = age;
      this.name = name;
  }

  //get set方法
  ...
  //将自身与o做对比 自身在前将是升序排序 反之降序
  @Override
  public int compareTo(StudentModel o) {
      return num -o.num ;
  }

  @Override
  public String toString() {
      return name+",num="+num+",age="+age;
  }
}

测试代码:

      List list = new ArrayList<>();
      list.add(new StudentModel(1,10,"张三"));
      list.add(new StudentModel(5,9,"李四"));
      list.add(new StudentModel(3,12,"王五"));
      
      Collections.sort(list);
      for (StudentModel item:list) {
          System.out.println(item);
      }

测试结果:根据编号升序排序

张三,num=1,age=10
王五,num=3,age=12
李四,num=5,age=9

2. Comparator用法

如果需求变更,希望按照学生age排序,则上述代码需要改动,这时候我们可以使用Comparator来满足需求,测试代码如下:

    Collections.sort(list, new Comparator() {
          @Override
          public int compare(StudentModel o1, StudentModel o2) {
              return o1.getAge()-o2.getAge();
          }
      });

      for (StudentModel item:list) {
          System.out.println(item);
      }

测试结果如下:

李四,num=5,age=9
张三,num=1,age=10
王五,num=3,age=12

二、总结

  1. Comparable与Comparator都可以实现排序,都是接口类型;
  2. Comparable放在实体类中,定意一种排序,当排序需求变更,无法满足;
  3. Comparator 可以理解为对Comparable的扩展,可以对同一个类定义多个排序规则,使用更加灵活。

你可能感兴趣的:(Java 集合排序Comparable与Comparator)