zoukankan      html  css  js  c++  java
  • Comparable和Comparator



    1. Comparable接口

    • 在java.lang包下,实现了Comparable函数式接口的对象可以自然排序,而数组和集合实现了该接口,所以我们会用Arrays.sort()或Collections.sort()来排序

    • Comparable比较大于就返回大于0的数,小于返回小于0,等于返回0

    • 如果自定义的对象也要排序,就需要实现该接口并且手动重写里面的compareTo()方法

    返回值 函数名 解释
    int compareTo(T o) 将此对象与指定的对象进行比较以进行排序

    需要排序的自定义对象

    public class User implements Comparable<User>{
    
    	private int age;
    	private String name;
    	
    	//省略各种Getters、Setters、toString、Constructor
        
    	@Override
        //重写方法
    	public int compareTo(User o) {
    		//根据成绩年龄来排序
    		if (this.age > o.age) return 1;
    		if (this.age < o.age) return -1;
    		return 0;
    	}
    }
    

    测试

    public static void main(String[] args) {
    	
    	//创建泛型集合
    	ArrayList<User> arrayList = new ArrayList<User>();
    	
    	//集合添加了四个奇怪名字的User
    	arrayList.add(new User(100,"Howl"));
    	arrayList.add(new User(1,"Howlet"));
    	arrayList.add(new User(50,"晚上没宵夜"));
    	arrayList.add(new User(7,"云吞面"));
    	
    	//compareTo方法测试
    	System.out.println( "compareTo方法测试: " + new User(100,"Howl").compareTo(new User(1,"Howlet")) + "
    ");
    	
    	//集合类排序
    	Collections.sort(arrayList);
    	
    	//输出排序后集合
    	Iterator iterator = arrayList.iterator();
    	while(iterator.hasNext()){
    		System.out.println(iterator.next());
    	}
    }
    

    输出

    compareTo方法测试: 1
    
    User [age=1, name=Howlet]
    User [age=7, name=云吞面]
    User [age=50, name=晚上没宵夜]
    User [age=100, name=Howl]
    


    2. Comparator

    • 在java.util包下,实现该接口的对象可以精确控制排序的顺序,还可以将该比较器传递给Collections.sort或Arrays.sort以实现控制顺序
    • 实现该接口需要重写里面的compare()方法

    返回值 函数名 解释
    int compare(T o1, T o2) 比较其两个参数的顺序

    需要排序的自定义对象

    public class UserComparator implements Comparator<User>{
    
    	@Override
    	public int compare(User o1, User o2) {
    		
    		//逆序
    		if (o1.getAge() > o2.getAge()) return -1;
    		if (o1.getAge() < o2.getAge()) return 1;
    		return 0;
    	}
    }
    

    测试(和上面的一样,只是下面的排序要添加比较器)

    //集合类排序
    Collections.sort(arrayList,new UserComparator());
    

    输出

    compareTo方法测试: -1
    
    User [age=100, name=Howl]
    User [age=50, name=晚上没宵夜]
    User [age=7, name=云吞面]
    User [age=1, name=Howlet]
    


    3. 比较二者

    • Comparable实现的是自然排序,是对象内部自己实现的
    • Comparator实现定制排序,是对象之外实现的,借助了外力来推动比较
    • 二者同时存在则使用Comparator排序


  • 相关阅读:
    SGU 205. Quantization Problem
    BZOJ1009: [HNOI2008]GT考试
    SGU 204. Little Jumper
    Spring Aspect 获取请求参数
    springboot 是用拦截器Interceptor获取请求的控制器和请求的方法名
    spring boot Filter过滤器的简单使用
    Java 使用Query动态拼接SQl
    java 传入list集合 返回树形菜单,for循环遍历
    spring data jpa 的简单使用
    vue项目引入element
  • 原文地址:https://www.cnblogs.com/Howlet/p/12182497.html
Copyright © 2011-2022 走看看