1.TreeSet介绍
TreeSet是SortedSet接口的实现类,可以确保集合元素处于排序状态,添加入TreeSet的元素会按照一定的顺序(自然排序或者定制排序)进行排列
2.TreeSet基础用法
举个栗子:
import java.util.TreeSet;
public class BaseCharacter {
public static void main(String[]args){
TreeSet nums=new TreeSet();
nums.add(5);
nums.add(7);
nums.add(1);
nums.add(3);
//按顺序输出
System.out.println("按顺序输出"+nums);
//输出第一个元素
System.out.println("输出第一个元素"+nums.first());
//输出第二个元素
System.out.println("输出最后一个元素"+nums.last());
//返回小于4的子集
System.out.println("返回小于4的子集"+nums.headSet(4));
//返回大于2的子集
System.out.println("返回大于2的子集"+nums.tailSet(2));
//返回在某个区间中的数字
System.out.println(nums.subSet(2,6));
}
}
TreeSet可以进行首位元素的输出,也可以进行尾部数据的输出,同时可以区间的设定,填充入TreeSet的参数会以一种顺序输出
3.TreeSet的自然排序
3-1:为什么TreeSet可以进行排序操作呢?
java中提供了Comparable接口,该接口定义了一个compareTo方法,TreeSet会调用集合元素的compareTo(Object obj)方法来进行元素之间的比较(该方法返回一个int值),如果返回正整数 则前一个大于后一个,如果返回0 相等,如果返回负整数,后一个大于前一个。
上述代码为自然排序(升序操作)
3-2:自然排序的注意事项
*实现Comparable的常用类,如果使用了没有实现接口的类,程序会抛出异常
*如果希望去正常运作TreeSet TreeSet只能添加同一种类型的对象
*最好不要去修改已经加入TreeSet的值(和HashSet原理差不多,如果再次修改成相同的元素,使得效率严重降低)
*TreeSet判断两个对象相等的标准是,两个对象通过compareTo方法返回0 所以可以通过重写方法观察一下:
import java.util.Objects;
import java.util.TreeSet;
/**
* 自然排序
* TreeSet会调用元素的comapareTo方法比较元素之间的大小关系 然后将集合元素按照升序排列(自然排序)
* 在java提供的Comparable接口中提供了compareTo(Object obj)方法,该方法返回一个整数值,如果返回的是0 表面相等
* 如果返回的是正整数,表明obj1>obj2 如果返回的是负整数 表明obj1<obj2
* BigDecimal Character Boolean String Date Time
**如果没有实现Comparable接口 程序抛出异常
* 如果希望去正常运作TreeSet TreeSet只能添加同一种类型的对象
*
* TreeSet判断两个对象相等的标准是,两个对象通过compareTo方法返回0
* */
public class NatureSort {
static class Z implements Comparable{
int age;
public Z(int age){
this.age=age;
}
@Override
public int compareTo(Object o) {
return 1;
}
}
public static void main(String[]args){
TreeSet set=new TreeSet();
Z z1=new Z(6);
//加入元素 虽然两个元素一样 但是通过重写方法 依旧可以进行添加
set.add(z1);
set.add(z1);
((Z)set.first()).age=9;//修改第一个元素的变量
System.out.println(((Z)set.first()).age);
System.out.println(((Z)set.last()).age);
}
}
在该方法中,虽然添加了两次z1,但是由于compareTo方法恒为1,所以依旧添加了相同的元素。(通过改变一个元素的值,第二个也被修改,所以证明两个元素为同一个对象的引用变量)
【但是这种做法十分危险 只在测试的时候使用!!】
3.TreeSet的定制排序
3-1:什么是定制排序?
通过Lambda表达式,进行对Comparator中规则的修改(下面的例子是把升序改为了降序),实现自定义排序规则
import java.util.TreeSet;
//定制排序
public class MyTreeSort {
int age;
public MyTreeSort(int age){
this.age=age;
}
public String toString(){
return "MyTreeSort[age:"+age+"]";
}
public static void main(String[]args){
//使用正则表达式对Comparator规则进行修改
TreeSet ts=new TreeSet((o1, o2) -> {
MyTreeSort m1=(MyTreeSort)o1;
MyTreeSort m2=(MyTreeSort)o2;
//具体改变规则
return m1.age>m2.age? -1:m1.age<m2.age?1:0;
});
ts.add(new MyTreeSort(4));
ts.add(new MyTreeSort(6));
ts.add(new MyTreeSort(3));
ts.add(new MyTreeSort(2));
System.out.println(ts);
}
}