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是在我們開發中更常用的(內聚度高)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章