风 华 是 一 指 流 砂 , 苍 老 是 一 段 年 华
目录
11.比较:floor()、lower()、ceiling()、higher()
一、概述
TreeSet是SortedSet接口的实现类,TreeSet可以保证集合元素处于排序状态;TreeSet支持两种排序方法:自然排序和定制排序,一般情况默认为自然排序;
排序时TreeSet会调用集合元素的compare(Object obj)方法比较元素之间的大小关系,然后将集合元素升序排列;
一个TreeSet内必须放入相同类的对象(即同一类型数据),否则将无法进行排序并且会报错,对此我们可以利用泛型来进行约束限制。
二、常用方法
1.定义一个HashSet类型的集合
//方法1
Set<Integer> set = new TreeSet<Integer>();
//方法2
TreeSet<Integer> ts = new TreeSet<Integer>();
Object位置为集合数据类型,称之为泛型,例如,如果集合中数据全部为整型数据,则泛型为Integer,如果集合中数据全部为字符串类型数据,则泛型为String,如果不确定集合中数据类型则可以将泛型定义为Object,这样就可以输入任意类型的数据。
2.添加数据:add()和addAll()
add()和addAll()两种方法都是向集合中添加数据,其中add()是向集合中添加单个数据,addAll()是向集合中添加另一个集合。
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add(1);
ts.add(4);
ts.add(3);
ts.add(5);
ts.add(2);
System.out.println(ts);//自然排序
ts.add(2);//不可重复
System.out.println(ts);
由输出结果可以看出TreeSet对输入数据自动进行了升序排列,且输入重复值时只会存储一个
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add(1);
ts.add(4);
ts.add(3);
ts.add(5);
ts.add(2);
System.out.println(ts);//自然排序
TreeSet<Integer> ts1 = new TreeSet<Integer>();
ts1.add(3);
ts1.add(4);
ts1.add(7);
ts1.add(9);
ts1.add(6);
System.out.println(ts1);//自然排序
ts.addAll(ts1);
System.out.println(ts);
由此可见利用addAll()将一个集合插入到另一个集合中时要求两个集合数据类型一致,否则无法插入,并且在插入后会自动去除重复值并重新按升序排列数据。
3.删除数据:remove()
//移除
ts.remove(3);
System.out.println(ts);
4.清空集合:clear()
//清空集合
ts.clear();
System.out.println(ts);
5.判断是否包含某元素:contains()
//判断是否包含某元素
System.out.println(ts.contains(2));
6.判断集合是否为空:isEmpty()
//判断集合是否为空
System.out.println(ts.isEmpty());
7.集合长度:size()
//集合元素个数
System.out.println(ts.size());
8.遍历集合
8.1 迭代器遍历
//迭代器遍历
Iterator<Integer> it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
Iterator<Object> it = ts.iterator();尖括号中为该集合泛型
while循环中hasNext()用来判断是否还有下一个值,如果有则用next()输出该值。
8.2 迭代器遍历并逆序输出
//遍历逆序输出
Iterator<Integer> tset = ts.descendingIterator();
while(tset.hasNext()) {
System.out.println(tset.next());
}
8.3 for each遍历
//for each遍历
for(Integer obj : ts) {
System.out.println(obj);
}
for循环中格式:泛型 变量 :集合名
其原理为依次将ts集合中的数据赋值给Integer型变量obj然后输出。
9. 获取集合中第一个元素:first()
//第一个元素
System.out.println(ts.first());
10.获取集合中最后一个元素:last()
//最后一个元素
System.out.println(ts.last());
11.比较:floor()、lower()、ceiling()、higher()
//返回集合中小于等于给定值的最大值
System.out.println(ts.floor(3));
//返回集合中小于给定值的最大值
System.out.println(ts.lower(3));
//返回集合中大于等于给定值的最小值
System.out.println(ts.ceiling(3));
//返回集合中大于给定值的最小值
System.out.println(ts.higher(3));
12.复制集合:clone()
//复制集合
Object ss = ts.clone();
System.out.println(ss);
13.返回该集合指定区间的值
13.1 subSet()
//给定两个元素,返回这两个元素之间的所有值(前闭后开区间)
System.out.println(ts.subSet(1, 3));
//给定两个元素,返回这两个元素之间的所有值,true表示包含该值,false表示不包含该值
System.out.println(ts.subSet(1, true, 5, false));
13.2 headSet()
//返回给定元素之前的所有值,但不包含该元素
System.out.println(ts.headSet(3));
//返回给定元素之前的所有值,true表示包含该元素,false表示不包含该元素
System.out.println(ts.headSet(3, true));
13.3 tailSet()
//返回给定元素之后的所有值且包含该元素
System.out.println(ts.tailSet(4));
//返回给定元素之后的所有值,true表示包含该元素,false表示不包含该元素
System.out.println(ts.tailSet(4, false));
14. 自定义排序Comparator
因为TreeSet默认的排序是调用Comparator接口中的compare函数,因此我们只需要重写compare函数即可实现对集合的自定义排序
先定义一个Person类,在该类中添加一个及一个以上的属性,并且分别添加一个无参构造函数和有参构造函数(参数为添加的属性),再创建一个compare方法重写Comparator接口中的compare函数。
public class lx {
public static void main(String args[]) {
Set<person> set = new TreeSet<person>(new person());
person p1 = new person("Tom",10);
person p2 = new person("李四",2);
person p3 = new person("Lucy",30);
set.add(p1);
set.add(p2);
set.add(p3);
for(person p : set) {
System.out.println(p.name+":"+p.age);
}
}
}
class person implements Comparator<person>{
int age;
String name;
public person() {
}
public person(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public int compare(person o1, person o2) {
if(o1.age > o2.age) {
return 1;
}else if(o1.age < o2.age) {
return -1;
}else {
return 0;
}
}
}
在上述代码中我们创建了一个person类,其中包括姓名和年龄,并且重写了compare函数,按年龄升序进行排列。
上面我们按照年龄升序排列元素,我们也可以按照降序排列,只需要将compare函数中的两个if语句的>和<交换位置即可实现,我们也可以改变其他比较的属性来自定义排序方法,例如按姓名首字母排序等