• Comparable和Comparator的区别


    Comparable

    Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

    Comparable接口是内比较器,也就是自己参与比较,需要实现compareTo方法。Comparable的compareTo方法需要传入一个对象,然后自己和该对象比较。

    有三种情况

    1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

    2、比较者等于被比较者,那么返回0

    3、比较者小于被比较者,那么返回负整数

    package algorithm;
    
    public class Person implements Comparable<Person> {    //Comparable后面的泛型不一定和当前类一样,可以是别的类,只要能把compareTo的算法写好就行,并不要求相同class比较。但是如果想要使用Collections.sort或Arrays.sort进行自动排序就必须是相同的class。
    
    	private String name;
    
    	public Person() {
    
    	}
    
    	public Person(String name) {
    		this.name = name;
    	}
    
    	public int compareTo(Person person) {
    		if (this.name.compareTo(person.name) > 0)
    			return 1;
    		else if (this.name.compareTo(person.name) == 0)
    			return 0;
    		else
    			return -1;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    }
     
    public static void main(String[] args) throws Exception {
    	Person d1 = new Person("c");
    	Person d2 = new Person("c");
    	Person d3 = new Person("b");
    	Person d4 = new Person("d");
    	System.out.println(d1.compareTo(d2));
    	System.out.println(d1.compareTo(d3));
    	System.out.println(d1.compareTo(d4));
    }
    

     结果

    0
    1
    -1
    

    Comparator 

    Comparetor是外比较器,相当于它本身不作为比较的对象,它提供的是一个比较平台。

    package algorithm;
    
    public class Person {
    
    	private String name;
    
    	public Person() {
    	}
    
    	public Person(String name) {
    		this.name = name;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    }
    
    public static void main(String[] args) throws Exception {
    		Person d1 = new Person("c");
    		Person d2 = new Person("a");
    		Person d3 = new Person("b");
    		List<Person> persons = new ArrayList<>();
    		persons.add(d1);
    		persons.add(d2);
    		persons.add(d3);
    		List<Person> orderPersons = sort(persons);;
    		for(Person person:orderPersons){
    			System.out.println(person.getName());
    		}
    	}
    	
    	 public static List<Person> sort(List<Person> persons){
    	      Collections.sort(persons, new Comparator<Person>(){
    	           public int compare(Person o1, Person o2) {
    	        	   if (o1.getName().compareTo(o2.getName()) > 0)
    	       			return 1;
    	       		else if (o1.getName().compareTo(o2.getName()) == 0)
    	       			return 0;
    	       		else
    	       			return -1;
    	           }
    
    	      });
    	  return persons;
    	 }
    

     结果是

    a
    b
    c
    

    这个是Comparator的匿名类的用法,当然也可以实现一个接口,哪个类实现了该接口就是作为一个比较器。

    Comparator的用法耦合度会低一些。

  • 相关阅读:
    使用Wireshark 抓取数据包
    React Native 开发之 (07) 常用组件-View
    Swift开发之 (01) 语法
    React Native 开发之 (05) flexbox布局
    React Native 开发之 (06) JSX
    深入浅出Redis02 使用Redis数据库(String类型)
    React Native 开发之 (04) 例子讲解
    npm命令大全
    npm
    node.js
  • 原文地址:https://www.cnblogs.com/tp123/p/6401994.html
Copyright © 2020-2023  润新知