Java中Comparator和Comparable两个接口的使用比较

下面通过两个例子来比较

1.Comparable

Person类直接实现Comparable接口

import java.util.Objects;

public class Person implements Comparable<Person>{

	private int id;
	private String name;
	private double salary;
	
	public Person() {}
	public Person(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	
	@Override
	public int hashCode() {
		return Objects.hash(id, name, salary);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (null == obj || this.getClass() != obj.getClass()) {
			return false;
		}
		
		Person person = (Person) obj;
		return id == person.id &&
				name.equals(person.name) &&
				salary == person.salary;
	}

	
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", salary=" + salary + "]";
	}

	@Override
	public int compareTo(Person o) {
		int ret = (int) ((this.salary - o.salary) * 100);
		return ret;
	}
	
	
	
}

实例检验:

import java.util.TreeSet;

public class Demo4 {

	public static void main(String[] args) {
		TreeSet<Person> treeSet = new TreeSet<Person>();
		
		Person p1 = new Person(1, "刘备", 10.23);
		Person p2 = new Person(2, "关羽", 29.54);
		Person p3 = new Person(3, "张飞", 20.23);
		Person p4 = new Person(4, "赵云", 49.12);
		Person p5 = new Person(5, "马超", 19.32);
		
		Person p6 = new Person(6, "黄忠", 1.56);
		Person p7 = new Person(6, "黄忠", 1.57);
		
		treeSet.add(p1);
		treeSet.add(p2);
		treeSet.add(p3);
		treeSet.add(p4);
		treeSet.add(p5);
		treeSet.add(p6);
		treeSet.add(p7);
		
		System.out.println(treeSet);
	}
}

结果:
[Person [id=6, name=黄忠, salary=1.56], Person [id=6, name=黄忠, salary=1.57], Person [id=1, name=刘备, salary=10.23], Person [id=5, name=马超, salary=19.32], Person [id=3, name=张飞, salary=20.23], Person [id=2, name=关羽, salary=29.54], Person [id=4, name=赵云, salary=49.12]]

按照salary升序排列,没有任何问题

2.Comparator

自定义personComparator

import java.util.Comparator;

public class personComparator implements Comparator<Person> {
	@Override
	public int compare(Person o1, Person o2) {
		int ret = (int) ((o1.getSalary() - o2.getSalary()) * 100);
		return ret;
	}
}

实例实现:

public class Demo5 {
	public static void main(String[] args) {
		TreeSet<Person> treeSet = new TreeSet<Person>(new Comparator<Person>() {

			@Override
			public int compare(Person o1, Person o2) {
				int ret = (int) ((o1.getSalary() - o2.getSalary()) * 100);
				return ret;
			}
			
		});
		
		Person p1 = new Person(1, "刘备", 10.01);
		Person p2 = new Person(2, "关羽", 29.54);
		Person p3 = new Person(3, "张飞", 20.23);
		Person p4 = new Person(4, "赵云", 49.12);
		Person p5 = new Person(5, "马超", 19.32);
		
		Person p6 = new Person(6, "黄忠", 10.78);
		Person p7 = new Person(7, "诸葛亮", 1.56);
		
		treeSet.add(p1);
		treeSet.add(p2);
		treeSet.add(p3);
		treeSet.add(p4);
		treeSet.add(p5);
		treeSet.add(p6);
		treeSet.add(p7);
		
		System.out.println(treeSet);
	}

}

结果:
[Person [id=7, name=诸葛亮, salary=1.56], Person [id=1, name=刘备, salary=10.01], Person [id=6, name=黄忠, salary=10.78], Person [id=5, name=马超, salary=19.32], Person [id=3, name=张飞, salary=20.23], Person [id=2, name=关羽, salary=29.54], Person [id=4, name=赵云, salary=49.12]]
这里也没有问题

3.总结

1.Comparator 和Comparable都是Java中的内部接口,都可以完成对我们自定义类的排序
2.Comparable接口是定义在类的内部,需要我们自定义的类implement我们的接口,并在类的内部实现比较方法的代码
3.Comparator接口实现在类的外部,单独实现一个比较器,不需要对原来的代码进行修改,所以Comparator是在我们开发中更常用的(内聚度高)
发布了6 篇原创文章 · 获赞 13 · 访问量 207

猜你喜欢

转载自blog.csdn.net/weixin_44009147/article/details/104487122
今日推荐