zoukankan      html  css  js  c++  java
  • Comparable和Comparator的学习笔记

    今天在项目开发中,遇到要对List中的对象按照对象某一属性进行排序的问题,我发现有两种实现方式:
    (1)实现Comparable接口;
    (2)实现Comparator接口;

    Comparable和Comparator的实现

    Comparable接口

    JDK的大量的类包括常见的 String、Byte、Char、Date等都实现了Comparable接口。
    实现方法:需要排序的类实现Comparable接口,并实现接口的compareTo方法;
    实例:按照User的年龄进行倒序排序

    public class User implements Comparable<User>{
    
    	private String name;
    	private int age;
    	
    	public User(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	@Override
    	public String toString() {
    		return "User [name=" + name + ", age=" + age + "]";
    	}
    	
    	@Override
    	public int compareTo(User o) {
    		if(o!=null){
                if(this.getAge()>o.getAge()){
                   return -1;
                }else if(this.getAge()==o.getAge()){
                   return 0;
                }
           }
            return 1;
    	}
    }
    
    
    public static void main(String[] args){
    	List<User> userList = new ArrayList<>();
    	userList.add(new User("Tom",2));
    	userList.add(new User("jack",23));
    	userList.add(new User("Shushan",1));
    	userList.add(new User("Idhua",21));
    	
    	Collections.sort(userList);
    	System.out.println(userList);
    }
    

    输出结果:
    [User [name=jack, age=23], User [name=Idhua, age=21], User [name=Tom, age=2], User [name=Shushan, age=1]]

    Comparator接口

    实现方法:新建一个类,实现Comparator接口,并实现compare方法;
    实例:使用匿名内部类、lambda或者新建一个类实现都行

    public class Person {
    
    	private String name;
    	private int number;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getNumber() {
    		return number;
    	}
    
    	public void setNumber(int number) {
    		this.number = number;
    	}
    
    	public Person(String name, int number) {
    		super();
    		this.name = name;
    		this.number = number;
    	}
    	
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", number=" + number + "]";
    	}
    }
    
    
    public static void main(String[] args){
        List<Person> list = new ArrayList<Person>();
    	list.add(new Person("Kobi", 1));
    	list.add(new Person("Cury", 3));
    	list.add(new Person("ZhanMushi", 2));
    	list.add(new Person("Dulante", 4));
    	list.add(new Person("Jordan", 0));
    	
    	//匿名内部类版本(根据number进行排正序)
    	Collections.sort(list, new Comparator<Person>() {
    		@Override
    		public int compare(Person o1, Person o2) {
    			if(o1.getNumber() < o2.getNumber()){
    				return -1;
    			}else if(o1.getNumber() == o2.getNumber()){
    				return 0;
    			}
    			return 1;
    		}
    	});
    	
    	//lambda版本(根据number排正序)
    	/*Collections.sort(list, (o1,o2)->{
    		if(o1.getNumber() < o2.getNumber()){
    			return -1;
    		}else if(o1.getNumber() == o2.getNumber()){
    			return 0;
    		}
    		return 1;
    	});
    	*/
    	
    	//新建一个类实现版本(根据name字段进排正序)
    	//Collections.sort(list,new PersonComparator());
    	
    	System.out.println(list);
    }
    
    public class PersonComparator implements Comparator<Person>{
    	@Override
    	public int compare(Person o1, Person o2) {
    		return o1.getName().compareTo(o2.getName());
    	}
    }
    

    输出结果
    匿名内部类版本和lambda版本:[Person [name=Jordan, number=0], Person [name=Kobi, number=1], Person [name=ZhanMushi, number=2], Person [name=Cury, number=3], Person [name=Dulante, number=4]]
    新建一个类实现版本:
    [Person [name=Cury, number=3], Person [name=Dulante, number=4], Person [name=Jordan, number=0], Person [name=Kobi, number=1], Person [name=ZhanMushi, number=2]]

    总结

    两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,
    但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义
    的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自
    己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

    参考自

    http://www.cnblogs.com/szlbm/p/5504634.html
    http://blog.csdn.net/mageshuai/article/details/3849143
    http://www.cnblogs.com/sunflower627/p/3158042.html

  • 相关阅读:
    nput="file" 浏览时只显示指定excel文件,筛选特定文件类型
    SSM三大框架的运行流程、原理、核心技术详解
    HttpServletRequest和ServletRequest的区别
    拦截器(Interceptor)与过滤器(Filter)的区别
    springboot整合webservice
    SpringBoot配置Cors解决跨域请求问题
    多线程同步锁和死锁以及synchronized与static synchronized 的区别
    大批量数据导出excel
    查看MySql版本号命令
    分布式锁初认识
  • 原文地址:https://www.cnblogs.com/wsygdb/p/7603687.html
Copyright © 2011-2022 走看看