zoukankan      html  css  js  c++  java
  • Java-对象比较器

    在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现了Comparable<T>接口。如果要比较的对象没有实现Comparable接口或Comparator接口而直接比较会报 java.lang.ClassCastException类型转换异常。

    两个对象进行比较方法一:实现Comparable<T>接口

    Person类是要比较的对象

    package com.lym.comparator;
    /**
     * 人类
     * 要使该类能进行比较,该类必须实现Comparable接口
     * @author Administrator
     *
     */
    public class Person implements Comparable<Person>{
    
    	private String name;
    	private int age;
    	public Person() {
    		super();
    	}
    	public Person(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 "Person [name=" + name + ", age=" + age + "]";
    	}
    	//当前类按年龄由小到大排序
    	//1和-1调换后就是按年龄由大到小排序的
    	@Override
    	public int compareTo(Person o) {
    		if(o == null){
    			throw new NullPointerException();
    		}
    		if(this.age>o.age){
    			return 1;
    		}else if(this.age<o.age){
    			return -1;
    		}
    		return 0;//相等
    	}
    	
    }
    
    方法二:实现Comparator<T>接口

    实现Comparator<T>接口与Comparable<T>接口有什么区别吗?

    答:Comparable<T>接口 是在要比较的对象类创建的时候就实现了,也就是在项目上线之前就设计好了,大多数时候是采用这种方法。但是,有的时候项目已经上线了,此时我们还要对某个类进行比较,而此时该类还没有实现Comparable<T>接口,为了遵守软件开发中“对扩展开放,对修改关闭”的原则,我们可以再定义一个比较器类,实现Comparator<T>接口,这样我们就不会破坏要比较的类的原有结构了。

    自定义比较器类

    package com.lym.comparator;
    
    import java.util.Comparator;
    
    /**
     * 自定义比较器类
     * 
     * @author Administrator
     * 
     */
    public class ComparatorDemo implements Comparator<Person2> {
    
    	@Override
    	public int compare(Person2 o1, Person2 o2) {
    		if (o1 == null || o2 == null) {
    			throw new NullPointerException();// 空指针异常
    		}
    		if (o1.getAge() > o2.getAge()) {
    			return 1;
    		} else if (o1.getAge() < o2.getAge()) {
    			return -1;
    		}
    		return 0;
    	}
    
    }
    

    Person2类

    package com.lym.comparator;
    
    /**
     * 人类
     * 
     * @author Administrator
     * 
     */
    public class Person2 {
    
    	private String name;
    	private int age;
    
    	public Person2() {
    		super();
    	}
    
    	public Person2(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 "Person2 [name=" + name + ", age=" + age + "]";
    	}
    
    }
    



    对象比较器测试类

    package com.lym.comparator;
    
    import java.util.Arrays;
    
    /**
     * 对象比较器测试类
     * @author Administrator
     *
     */
    public class ComparableDemo {
    
    	public static void main(String[] args) {
    		String[] names = {"利亚","藤兰","泉彩","井空","岛爱","结衣"};
    		
    		Person[] persons = {
    				new Person("泉彩",23),new Person("岛爱",25),
    				new Person("藤兰",41),new Person("结衣",35),
    				new Person("利亚",28),new Person("井空",32)
    		};
    		
    		Person2[] persons2 = {
    				new Person2("泉彩",23),new Person2("岛爱",25),
    				new Person2("藤兰",41),new Person2("结衣",35),
    				new Person2("利亚",28),new Person2("井空",32)
    		};
    		
    		Arrays.sort(names);
    		System.out.println(Arrays.toString(names));
    		
    		//实现Comparable<T>接口
    		Arrays.sort(persons);//按Person对象的age属性比较大小
    		System.out.println(Arrays.toString(persons));//输出比较后的对象数组
    		
    		//自定义比较器,实现Comparator<T>接口
    		Arrays.sort(persons2);
    		System.out.println(Arrays.toString(persons2));
    	}
    
    }
    



  • 相关阅读:
    sqhhb
    12333
    12

    今日份
    12
    彻底理解 Cookie、Session、Token
    https原理
    12312
    uiower
  • 原文地址:https://www.cnblogs.com/liuyanmin/p/5146534.html
Copyright © 2011-2022 走看看