TreeSet是Collection的其中一个子接口Set接口的一个实现类。
TreeSet要求对于存入其中的元素要实现一个比较器故其可以确保集合元素处于排序状态。
在排序中 它对对数组、英文采用字典顺序 ,对汉字采用汉字的Unicode码进行排序
它的排序方式分为自然排序和定制排序
当集合的元素为对象时就该对象的类就必须实现Comparable接口,在实现Comparable接口时,我们可以重写compare方法
使元素可以按照我们想要的顺序排列。
我们主要看一下定制排序的实现方法。
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Person> perSet = new TreeSet<Person>(new Comparator<Person>() {
//使用匿名内部类的方法让Person类实现Comparable接口 并重写compare方法
@Override
public int compare(Person o1, Person o2) {
//如果姓名一样则按照年龄大小排序
if(o1.name.compareTo(o2.name) == 0) {
return o1.age.compareTo(o2.age);
}
//姓名不同就按照姓名的顺序排序
return o1.name.compareTo(o2.name);
}
});
//创建对象
Person stu1 = new Person("张三", 21);
Person stu2 = new Person("张四", 20);
Person stu3 = new Person("赵六", 27);
Person stu4 = new Person("刘能", 23);
Person stu5 = new Person("张三", 24);
//将对象添加到集合中
perSet.add(stu1);
perSet.add(stu2);
perSet.add(stu3);
perSet.add(stu4);
perSet.add(stu5);
//使用迭代器遍历集合中的元素
Iterator<Person> iter = perSet.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}
public class Person {
int num;
String name;
public Person(int num, String name) {
super();
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "Person [num=" + num + ", name=" + name + "]";
}
}
输出结果:
定制排序还可以通过外部类来实现。
import java.util.Comparator;
//自己定义一个类去实现Comparator接口
public class MyComparator implements Comparator<Person>{
//<Person>是泛型的使用 去掉也是可以的 如果去掉的话,在重写compare方法是就要对两个形参进行强转Person per1 = (Person)o1
//重写compare方法 按照自己想要的顺序排序
@Override
public int compare(Person o1, Person o2) {
if(o1.name.compareTo(o2.name) == 0) {
return o1.age.compareTo(o2.age);
}
return o1.name.compareTo(o2.name);
}
}
public class Test {
public static void main(String[] args) {
TreeSet<Person> perSet = new TreeSet<Person>(new MyComparable());
Person stu1 = new Person("张三", 21);
Person stu2 = new Person("张四", 20);
Person stu3 = new Person("赵六", 27);
Person stu4 = new Person("刘能", 23);
Person stu5 = new Person("张三", 24);
perSet.add(stu1);
perSet.add(stu2);
perSet.add(stu3);
perSet.add(stu4);
perSet.add(stu5);
Iterator<Person> iter = perSet.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
}