【Java】Java中常用的比较器实现

在本文中就不介绍基本数据类型之间的比较了,自定义的对象类型进行比较时,java中常见的比较器方法主要是有以下几种。

1、覆写Object类的equals方法

如果一个自定义的对象类中没有覆写equals方法,这是使用equals进行比较两个对象与使用"=="是一样的,都是比较的是两个对象的地址(即两个对象是否为同一个对象);
如果覆写了equals()方法,则是比较其中的属性值是否相等。下面以People类来举例:

public class People{
	public People(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	private String name;
	private int age;
	//....getter and setter
}

测试:

	@Test
	public void testPeople1() {
		People people=new People("zhangsan",11);
		People people1=new People("zhangsan",11);
		System.out.println(people.equals(people1));
	}
	输出结果为:false

在上述的People类中覆写equals(),如下所示:

public class People {
	
	public People(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		People other = (People) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	private String name;
	private int age;
	//....getter and setter
}

测试代码与上述的一致,此时返回的结果就为:true

2、实现Comparable接口

使用Comparable的时候需要在你需要排序的类里边实现该接口,例如我们使用TreeSet来存储数据的时候,对于我们自定义的类就需要实现该接口来说明一下排序的规则,一般类型如String、Integer等则不需要,因为其已经实现了该接口。

public class People implements Comparable<People>{
	
	@Override
	public String toString() {
		return "People [name=" + name + ", age=" + age + "]";
	}

	public People(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	private String name;
	private int 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 int compareTo(People o) {
		if (this.age>o.age) {
			return 1;
		}else if (this.age<o.age) {
			return -1;
		}else {
			return 0;
		}
	}
}

测试:

	@Test
	public void testPeople() {
		Set<People> set=new TreeSet<>();
		set.add(new People("张三",112));
		set.add(new People("李四", 23));
		for (People people : set) {
			System.out.println(people);
		}
	}

打印结果:

People [name=李四, age=23]
People [name=张三, age=112]

如果是需要倒序的话,只需改变compareTo()的策略即可,如下:

	@Override
	public int compareTo(People o) {
		if (this.age>o.age) {
			return -1;
		}else if (this.age<o.age) {
			return 1;
		}else {
			return 0;
		}
	}

输出结果为:

People [name=张三, age=112]
People [name=李四, age=23]
3、可以单独建立一个对象比较器类,来实现Comparator接口

实现Comparator接口的方法需要单独构建一个比较器类,如下所示:

public class StudentCompator implements Comparator<Student> {

	@Override
	public int compare(Student o1, Student o2) {
		int i=0;
		// 按照年龄正序
		//i=o1.getAge()-o2.getAge();
		// 按照年龄倒序
		i= o2.getAge()-o1.getAge();
		return i;
	}
}

自定义的Student类,代码如下:

public class Student {

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	private String name;
	private int 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 "Student [name=" + name + ", age=" + age + "]";
	}	
}

使用:

public class StudentTest {

	@Test
	public void testStudent() {
		Set<Student> set=new TreeSet<>(new StudentCompator());
		set.add(new Student("张三",112));
		set.add(new Student("李四", 23));
		for (Student student : set) {
			System.out.println(student);
		}
	}
}

打印输出结果:

Student [name=张三, age=112]
Student [name=李四, age=23]

方法2和3的主要区别在于,方法2中需要去修改要进行比较的自定义的类中的代码,而方法3则不需要去修改。
参考文章:JAVA comparable的使用方法与实例

发布了66 篇原创文章 · 获赞 6 · 访问量 9409

猜你喜欢

转载自blog.csdn.net/qgnczmnmn/article/details/103610771