【Java】Set集合之TreeSet

 风 华 是 一 指 流 砂 , 苍 老 是 一 段 年 华

目录

一、概述

二、常用方法

1.定义一个HashSet类型的集合

2.添加数据:add()和addAll()

3.删除数据:remove()

4.清空集合:clear()

5.判断是否包含某元素:contains()

6.判断集合是否为空:isEmpty()

7.集合长度:size()

8.遍历集合

8.1 迭代器遍历

8.2 迭代器遍历并逆序输出

8.3 for each遍历

9. 获取集合中第一个元素:first()

10.获取集合中最后一个元素:last()

11.比较:floor()、lower()、ceiling()、higher() 

12.复制集合:clone()

13.返回该集合指定区间的值

13.1 subSet()

13.2 headSet()

13.3 tailSet()

14. 自定义排序Comparator


一、概述

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语句的>和<交换位置即可实现,我们也可以改变其他比较的属性来自定义排序方法,例如按姓名首字母排序等

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离陌lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值