TreeSet的自然排序和定制排序
TreeSet
- 向TreeSet中添加的元素必须时同一个类的。
- 可以按照添加进集合中的元素的指定的顺序遍历。
- 当向TreeSet中添加自定义类的对象时,有两种排序方法:
自然排序
要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object object)方法,
在此方法中,指明按照自定义类的哪个属性进行排序。
代码实现(按照名字排序):
Person实体类
import java.util.Objects;
public class Person implements Comparable{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//此处省略空参构造器和get() set()方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "name:" + name + ", age:" + age;
}
/**
* 当向treeset中添加person对象时,依据此方法,确定按照哪个属性排序
* @param o
* @return
*/
@Override
public int compareTo(Object o) {
if (o instanceof Person){
// return this.name.compareTo(((Person) o).name);
int i = this.name.compareTo(((Person) o).name);
if (i == 0){ //若名字相等,再比较年龄
return this.age - ((Person) o).age;
}
return i;
}
return 0;
}
}
测试类
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
testNaturalOrdering();
}
/**
* TreeSet的自然排序
*/
public static void testNaturalOrdering(){
TreeSet<Person> set = new TreeSet<>();
//如果Person类没有实现Comparable接口,向TreeSet中添加Person对象时会报ClassCast异常
set.add(new Person("AA",20));
set.add(new Person("GG",25));
set.add(new Person("BB",21));
set.add(new Person("DD",22));
set.add(new Person("MM",19));
set.add(new Person("AA",20));
for (Object obj:set) {
System.out.println(obj);
}
}
}
运行结果:
name:AA, age:20
name:AA, age:21
name:BB, age:21
name:DD, age:22
name:GG, age:25
name:MM, age:19
定制排序
1.创建一个实现了Comparator接口的类对象
2.将此对象作为形参传入TreeSet的构造器
3.向TreeSet中添加元素
代码实现(按照id排序):
Customer实体类
import java.util.Objects;
public class Customer {
String name;
String id;
public Customer(String name, String id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Customer customer = (Customer) o;
return Objects.equals(name, customer.name) &&
Objects.equals(id, customer.id);
}
@Override
public int hashCode() {
return Objects.hash(name, id);
}
@Override
public String toString() {
return "name:" + name + ", id:" + id ;
}
}
测试类
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// testNaturalOrdering();
testCustomSodrt();
}
/**
* TreeSet的定制排序
*/
public static void testCustomSodrt(){
Comparator com = new Comparator() {
//向TreeSet中添加Customer类的对象,在此compare()方法中,指明是按照Customer的哪个属性排序的
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Customer && o2 instanceof Customer){
Customer c1 = (Customer)o1;
Customer c2 = (Customer)o2;
int i = c1.getId().compareTo(c2.getId());
if (i == 0){ //若id相等,再比较name
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
};
TreeSet<Customer> set = new TreeSet<>(com);
set.add(new Customer("AA","1101"));
set.add(new Customer("HH","1001"));
set.add(new Customer("FF","1111"));
set.add(new Customer("NN","2101"));
set.add(new Customer("GG","1101"));
set.add(new Customer("AA","1103"));
for (Object obj:set) {
System.out.println(obj);
}
}
}
运行结果
name:HH, id:1001
name:AA, id:1101
name:GG, id:1101
name:AA, id:1103
name:FF, id:1111
name:NN, id:2101