比较器接口:
----| 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());
}
}