众所周知,在集合中,Set集合是无序、无索引、不可重复的,但其中有一个子类是有序的,那就是TreeSet,TreeSet的底层使用的是TreeMap实现。
代码案例:
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set<Person> set = new TreeSet<>();
set.add(new Person("二狗",35));
set.add(new Person("铁蛋",32));
set.add(new Person("福贵",21));
for (Person p : set){
System.out.println(p);
}
}
}
报错:无法强制转换为java.lang.Comparable
解决:
所以在使用TreeSet集合时:
(1)实现Comparable接口,重写compareTo()方法
Person.java(实体类)
import java.util.Comparator;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
/*
* 规则:
如果方法的返回值为-1,默认添加的元素比较大,放在右子树
如果方法的返回值为1,默认添加的元素比较小,放在左子树
如果方法的返回值为0,默认将添加的元素视为重复的,就去重
*/
//先按照年龄升序排列。如果年龄相同,再按照姓名默认排列
int result1 = this.age - o.age;
int result2 = this.name.compareTo(o.getName());
return result1 == 0 ? result2 : result1;
}
}
Test.java (测试类)
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Set<Person> set = new TreeSet<>();
set.add(new Person("二狗", 35));
set.add(new Person("铁蛋", 32));
set.add(new Person("福贵", 21));
for (Person p : set) {
System.out.println(p);
}
}
}
(2)创建TreeSet集合对象时传入一个Comparator接口,重写compare方法
Person.java(实体类)
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Test.java(测试类)
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
Comparator<Person> com = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
/*
* o1:集合中已经存在的元素(底层默认循环获取)
* o2:即将要添加的元素*/
int result1 = o1.getAge() - o2.getAge();
int result2 = o1.getName().compareTo(o2.getName());
//先按照年龄升序,年龄相同,再按照姓名自然排序
return result1 == 0 ? result2 : result1;
}
};
Set<Person> set = new TreeSet<>(com);
set.add(new Person("二狗", 35));
set.add(new Person("铁蛋", 32));
set.add(new Person("福贵", 21));
for (Person p : set) {
System.out.println(p);
}
}
}