1.TreeSet去重原理
我们都知道Set集合中的元素都是无序不重复的,而TreeSet中的元素却是有序不重复的,所以在保存没有实现排序功能的对象时,他不知道应该怎么进行进行排序,直接往TreeSet集合中添加没有实现Compareable或者没有传入构造器时就会报错类似下面的错:
Exception in thread “main” java.lang.ClassCastException: Student cannot be castto java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)
at TreeSetOrderDemo.main(TreeSetOrderDemo.java:18)
所以我们此时要用TreeSet进行排序,就得手动实现排序功能。
2.两种实现方式
有两种方式实现,第一种:在TreeSet的构造器中传入一个实现Comparator对象的比较器,或者匿名实现里面方法,int compare(Student obj1, Student obj2)方法返回1则是从小到大排序,反而之从大到小排序,返回0则两个对象相同,不保存。
2.1 在TreeSet的构造器中传入一个实现Comparator对象的比较器,代码示例如下:
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import lombok.Data;
public class TreeSetOrderDemo {
/**
* 演示TreeSet集合中的定制排序,按照学生年龄从小到大排序,
* @param args
*/
public static void main(String[] args) {
Set set = new TreeSet<>(**new Comparator() {
@Override
public int compare(Student obj1, Student obj2) {
if (obj1.getAge() > obj2.getAge()) {
return 1;
} else {
if (obj1.getAge() < obj2.getAge()) {
return -1;
}
}
return 0;
}
}**);
Student stu1 = new Student(“貂蝉”, 17);
Student stu2 = new Student(“西施”, 25);
Student stu3 = new Student(“王昭君”, 22);
Student stu4 = new Student(“杨贵妃”, 19);
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
System.out.println(set);
}
}
@Data
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
打印输出结果:
[Student(name=貂蝉, age=17), Student(name=杨贵妃, age=19), Student(name=王昭君, age=22),Student(name=西施, age=25)]
2.2实现compare接口的方式:
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
import lombok.Data;
public class TreeSetOrderDemo {
/**
* 演示TreeSet集合中的定制排序,按照学生年龄从小到大排序,
* @param args
*/
public static void main(String[] args) {
Set set = new TreeSet<>();
Student stu1 = new Student(“貂蝉”, 17);
Student stu2 = new Student(“西施”, 25);
Student stu3 = new Student(“王昭君”, 22);
Student stu4 = new Student(“杨贵妃”, 19);
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
System.out.println(set);
}
}
@Data
class Student implements Comparable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student stu) {
return this.age - stu.age;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}