比较器Comparable和比较器Comaprator的不同

比较器接口:

----| Comparable

           compareTo(Object o)     元素自身具备比较性

----| Comparator

           compare( Object o1, Object o2 ) 给容器传入比较器

TreeSet集合排序的两种方式:

一,让元素自身具备比较性。

也就是元素需要实现Comparable接口,覆盖compareTo 方法。

这种方式也作为元素的自然排序,也可称为默认排序。

年龄按照条件,年龄相同再比姓名。

package TreeSetJiHe;
/*
 * 这里写不写HashCode与equals方法都一样,TreeSet自定义的就是不可以存入相同的元素。
 * 即便对于对象来说,每个对象就算元素相同,但是表示的地址还是不同,应视为不同元素
 * 但是TreeSet还是将元素相同的对象视为统一对象,这是我自己粗浅的理解,希望大家不要吐槽
 * 
 * 实现Comparable接口,覆盖compareTo 方法的需求:
 * 让元素自身具备比较性
 *  
 */
public class Person implements Comparable{
	private String name;
	private int age;
	private String sex;
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the age
	 */
	public int getAge() {
		return age;
	}
	/**
	 * @param age the age to set
	 */
	public void setAge(int age) {
		this.age = age;
	}
	/**
	 * @return the sex
	 */
	public String getSex() {
		return sex;
	}
	/**
	 * @param sex the sex to set
	 */
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
//	@Override
//	public int hashCode() {
//		final int prime = 31;
//		int result = 1;
//		result = prime * result + age;
//		result = prime * result + ((name == null) ? 0 : name.hashCode());
//		result = prime * result + ((sex == null) ? 0 : sex.hashCode());
//		return result;
//	}
//	/* (non-Javadoc)
//	 * @see java.lang.Object#equals(java.lang.Object)
//	 */
//	@Override
//	public boolean equals(Object obj) {
//		if(obj instanceof Person){
//			Person person=(Person)obj;
//			return person.name.equals(this.getName())&&person.sex.equals(this.getSex())&&person.age==this.getAge();
//		}
//		return false;
//	}
	@Override
	public int compareTo(Object obj) {
		Person p = (Person) obj;
		if (this.age > p.age) {
			return 1;
		}
		if (this.age < p.age) {
			return -1;
		}
		return this.name.compareTo(p.name);

	}
	
}

测试类:

package TreeSetJiHe;

import java.util.TreeSet;

public class Test01 {

	public static void main(String[] args) {
		TreeSet ts = new TreeSet();
		ts.add(new Person("aa", 20, "男"));
		ts.add(new Person("bb", 18, "女"));
		ts.add(new Person("cc", 17, "男"));
		ts.add(new Person("dd", 17, "女"));
		ts.add(new Person("dd", 15, "女"));
		ts.add(new Person("dd", 15, "女"));


		System.out.println(ts);
		System.out.println(ts.size()); 


	}

}

二,让容器自身具备比较性,自定义比较器。(Person方法同上)

需求:当元素自身不具备比较性,或者元素自身具备的比较性不是所需的。

那么这时只能让容器自身具备。

定义一个类实现Comparator 接口,覆盖compare方法。

并将该接口的子类对象作为参数传递给TreeSet集合的构造函数。

当Comparable比较方式,及Comparator比较方式同时存在,以Comparator

比较方式为主。

package TreeSetJiHe;

public class Book {
	private String name;
	private double price;

	public Book() {

	}

	public String getName() {
		return name;
	}

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

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public Book(String name, double price) {

		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Book [name=" + name + ", price=" + price + "]";
	}

}


package TreeSetJiHe;

import java.util.Comparator;
/*需求:当元素自身不具备比较性,
 * 或者元素自身具备的比较性不是所需的,就像
 * 元素定义的是用年龄来比较,而实际需要用姓名字符串的长度来比较
 * 
 * 这时,只能让容器(TreeSet)自身具备比较性,自定义比较器
 * 定义一个类
 * 实现接口comparator,在compare方法中实现了元素的比较,
 * 这就相当于重新定义了一个比较器,按照自己指定的规则比较
 * 并将该接口的子类对象作为参数传递给TreeSet集合的无参构造函数
 * 当Comparable比较方式与comparator同时存在的时候,
 * 以comparator比较方式为主
 */
public class MyComparator implements Comparator{
	public int compare(Object o1, Object o2) {
		Book b1 = (Book) o1;
		Book b2 = (Book) o2;
		System.out.println(b1+" comparator "+b2);
		if (b1.getPrice() > b2.getPrice()) {
			return 1;
		}
		if (b1.getPrice() < b2.getPrice()) {
			return -1;
		}
		return b1.getName().compareTo(b2.getName());
	}

}

猜你喜欢

转载自blog.csdn.net/loveliness_peri/article/details/80159799