TreeSet的使用

TreeSet
概述:
TreeSet是一种排序的Set集合;
数据存储采用的是NaviatableMap,底层实际上是TreeMap实现的,本质上是一个红黑树原理。

Random r=new Random();
		List<Integer> list=new ArrayList<>();
		Set<Integer> set=new TreeSet<>();
		while(set.size()<10){
		    int k=r.nextInt(20);
		    list.add(k);
		    set.add(k);
		}
		System.out.println("生成的数据为:");
		System.out.println(list);
		System.out.println("插入TreeSet中的数据为:");
		System.out.println(set);

总结:
1.TreeSet不保证元素的添加顺序(LinkedHashSet),但是会对集合中的元素进行排序,需要Comparable或者Comparator。
2.TreeSet底层采用红黑树算法(近似平衡排序二叉树),比较适合查询,但是由于需要定位存储位置,所以增删的效率较低。
自然排序
1.TreeSet会调用comparaTo方法比较元素的大小,然后按照升序排列。所以自然排序中的元素都必须实现Comparable接口,否则抛出异常。
2.TreeSet的重复判断不是采用hashCode和equals实现的,而是依靠compareTo返回值为0进行判断。

public class Person implements Comparable<Person>{
	private Long id; 
	private String name; 
	private int age;
	public int compareTo(Person o) {
		int res = this.name.compareTo(o.name); 
		if (res != 0) 
			res *= -1; 
		else {
			res = this.id.compareTo(o.id); 
			}
		return res;
	}
}
public static void main(String[] args) {
		Set<Person> set = new TreeSet<>();
		for (int i = 0; i < 12; i++) {
			Person tmp = new Person();
			tmp.setId(1L + i);
			if (i % 3 == 0) tmp.setName("name-3");
			else tmp.setName("name-" + i);
			tmp.setAge(18);
			set.add(tmp);
		}
		// System.out.println(set.size()); 
		for (Person tmp : set) System.out.println(tmp);
	}

定制排序
定制排序时需要关联一个额外的Comparator对象,由Comparator对象提供排序逻辑。

Set<Person> set=new TreeSet<>((obj1,obj2)->{ 
//定义排序规则 
	Person p1=(Person)obj1; 
	Person p2=(Person)obj2; 
	return p2.getId().compareTo(p1.getId()); //倒排序 
}); 
for(int i=0;i<10;i++){ 
	set.add(new Person(1L+i,(9-i)+"name")); 
}
set.forEach(System.out::println);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值