/**
* 1、TreeSet集合底层实际上是一个TreeMap
* 2、TreeSet集合中的元素:无序不可重复,但可按照元素的大小顺序自动排序,称为:可排序集合。
* 3、放到TreeSet集合中的元素,等同于放到TreeMap集合key部分。
* 4、自定义类型时,排序有两种方式:
* 第一种:放在集合中的元素实现java.lang.Comparable接口。
* 第二种:在构造TreeSet或者TreeMap集合的时候传递一个比较器对象。
* 5、Comparable和Comparator怎么选择?(Comparable是java.lang包下的,Comparator是java.util包下的)
* 当比较规则不会发生改变的时候,或者说当比较规则只有1个的时候,建议实现Comparable接口。
* 若比较规则有多个,且需要多个比较规则之间频繁切换,建议使用Comparator接口。
*/
public class TreeSetTest01 {
public static void main(String[] args) {
TreeSet<String> ts1 = new TreeSet<>();
ts1.add("haha");
ts1.add("hehe");
ts1.add("heihei");
ts1.add("xixi");
for(String s : ts1){
//按照字典顺序升序
System.out.println(s);
}
}
}
自定义类型时排序:
一:实现Compara接口
//实现Comparable接口
public class TreeSetTest05 {
public static void main(String[] args) {
TreeSet<We> ts = new TreeSet<>();
ts.add(new We(142));
ts.add(new We(23));
ts.add(new We(28));
for(We w : ts){
System.out.println(w);
}
}
}
class We implements Comparable<We>{
int age;
public We(int age){
this.age = age;
}
@Override
public String toString() {
return "Cpp{" +
"age=" + age +
'}';
}
@Override
public int compareTo(We o) {
return this.age - o.age;//升序
}
}
二:实现比较器:
/实现比较器的第一种代码编写方式(需要先编写一个比较器取继承ComparaTor<>)
public class TreeSetTest02 {
public static void main(String[] args) {
//给构造方法传递一个比较器
TreeSet<Vip> vip = new TreeSet<>(new VipComparator());
vip.add(new Vip(2000));
vip.add(new Vip(200));
vip.add(new Vip(138));
vip.add(new Vip(221));
for(Vip v : vip){
System.out.println(v);
}
}
}
class Vip{
int age;
public Vip(int age){
this.age = age;
}
@Override
public String toString() {
return "vip{" +
"age=" + age +
'}';
}
}
//单独编写一个比较器
class VipComparator implements Comparator<Vip>{
public int compare(Vip v1,Vip v2){
return v1.age - v2.age;
}
}
//实现比较器的第二种方式(使用匿名内部类,无需单独编写出比较器)
public class TreeSetTest03 {
public static void main(String[] args) {
//使用匿名内部类(这个类没有名字,直接new接口实现)
TreeSet<Vip1> ts = new TreeSet<>(new Comparator<Vip1>() {
@Override
public int compare(Vip1 v1, Vip1 v2) {
return v1.age - v2.age;
}
});
}
}
class Vip1{
int age;
public Vip1(int age){
this.age = age;
}
@Override
public String toString() {
return "vip{" +
"age=" + age +
'}';
}
}