TreeSet的特征是集合中的元素是有序并且唯一的
在创建TreeSet对象的时候,是需要设定比较规则的
设定比较规则有两种方式:一种是使用comparator设定外部比较规则,另一种是通过comparable设定内部比较规则
comparable内部比较器
public class Person implements Comparable<Person>{
@Override
public int compareTo(Person o) {
//return this.name.compareTo(o.getName());
//return this.name.length()-o.getName().length();
return this.age-o.getAge();
}
}
comparator外部比较器
public class AgeCom implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
}
1、创建类,并且同时写内部比较规则
package com.wyq.Arr;
public class Pers implements Comparable<Pers>{
/**
* person类实现了Compatator接口
* 那么他具备一种能力,就是比较的能力
*/
private String name;
private Gender gender;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Pers(String name, Gender gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
public Pers() {
super();
}
@Override
public int compareTo(Pers o) {
//按照年龄进行比较
// return this.age-o.getAge();
//字母的升序进行比较
// return this.name.compareTo(o.getName());
//按照字母的长度进行比较
return this.name.length()-o.getName().length();
}
}
2、创建外部比较规则
package com.wyq.Arr;
import java.util.Comparator;
public class AgeCom implements Comparator<Pers>{
@Override
public int compare(Pers o1, Pers o2) {
return o1.getAge()-o2.getAge();
}
}
3、创建测试类
package com.wyq.Arr;
import java.util.TreeSet;
public class TestPers {
public static void main(String[] args) {
//创建treeset对象的集合,明确了存储的对象的类型只能是pers类型
TreeSet<Pers> ts = new TreeSet<Pers>(new AgeCom());
/**
* 因为TreeSet集合存储的元素的特点是:有序,唯一
* 需要存储的对象要具备比较规则
* 如果存储的自定义对象,不具备比较规则,那么程序就将产生类型转换异常
*/
Pers p1 = new Pers("张三",Gender.女,30);
Pers p2 = new Pers("李四",Gender.男,32);
Pers p3 = new Pers("王五",Gender.女,31);
Pers p4 = new Pers("马六",Gender.男,20);
ts.add(p1);
ts.add(p2);
ts.add(p3);
ts.add(p4);
System.out.println(ts.size());
for(Pers str:ts){
System.out.println(ts);
}
}
}
上边代码中在创建TreeSet对象的时候,同时设定了内部比较规则和外部比较规则,但是当二者同时出现的时候,外部比价规则更有优先级。