java日常学习:TreeSet

#java代码块


##TreeSet
集合系统:
-----------| Collection 单列集合的根接口
----------------| List 如果是实现了List接口的集合类,具备的特点:有序,元素可重复。
--------------------| ArrayList 底层是使用了一个Object数组实现的, 特点:查询速度快,增删速度慢。
--------------------| LinkedList 底层是使用了链表数据结构实现的,特点:查询速度慢, 增删快。
--------------------| Vector(了解) Vector 底层也是使用了Object数组实现的, 是线程安全的,操作效率低。
----------------| Set 如果是实现了Set接口的集合类, 具备的特点: 无序,元素不可重复。
--------------------| HashSet 底层是使用了一个哈希表实现的,特点: 存取速度快。
--------------------| TreeSet 底层是使用了红黑树(二叉树)数据结构实现 , 特点:可以对元素进行排序存储。

TreeSet 要注意的事项:
1. 如果往TreeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么treeSet就会按照元素自然顺序的特性进行排序存储。
2. 如果往TreeSet添加元素的时候, 如果元素本身不具备自然顺序的特性, 那么元素所属的类就必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。
3. 在TreeSet中如果比较的方法返回的是0,该元素则被视为重复元素,不允许添加。
4. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现Comparable接口,那么在创建TreeSet对象 的时候就必须要传入一个比较器对象。

TreeSet 要注意的事项:

  1. 往TreeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么treeSet就会按照元素自然顺序的特性进行排序存储。
  2. 往TreeSet添加元素的时候, 如果元素本身不具备自然顺序的特性, 那么元素所属的类就必须要实现Comparable接口,把元素的比较规则定义在compareTo(T o)方法上。
  3. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现Comparable接口,那么在创建TreeSet对象 的时候就必须要传入一个比较器对象。
  4. 如果元素已经实现了Comparable接口,当时创建TreeSet对象的时候又传入了比较器对象,那么比较规则优先使用比较器的。

推荐使用: 比较器。

疑问:如何创建一个比较器对象:

比较器的创建格式:
	
	class 类名   implements  Comparator{
	
	}

##练习一
//比较器的使用
class Emp implements Comparable {

	String name;
	
	int age;
	
	double salary;

	public Emp(String name, int age, double salary) {
		this.name = name;
		this.age = age;
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "{ 姓名:"+ this.name+" 年龄:"+ this.age+ " 薪水:"+this.salary+"}";
	}

	/*
	 * 元素与元素之间的比较规则定义在COmparaTo方法上。(non-Javadoc)
	 	返回值:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 

	 */
	@Override  //  100.52 - 100.32 = 0.2
	public int compareTo(Emp e) {
		return (int)((this.salary-e.salary)*100);
	}
}

//自定义一个比较器类
class AgeComparator implements Comparator<Emp>{

	@Override
	public int compare(Emp o1, Emp o2) {
		return o1.age-o2.age;
	}
}


public class Demo1 {

	public static void main(String[] args) {
		//创建一个比较器对象
		AgeComparator ageComparator = new AgeComparator();
		
		TreeSet tree = new TreeSet(ageComparator);
		tree.add(new Emp("大毛",6,200));
		tree.add(new Emp("小毛",5,100));    
		tree.add(new Emp("二狗",8,300));
		tree.add(new Emp("狗子",3,500));
		
		System.out.println(tree);
	}
	
}

##练习二

//例如String str="8 10 25 5 3 7";  要求使用TreeSet对象把字符串拼接成如下格式:  "3 5 7 8 10 25" 

package day05_test;

import java.util.Iterator;
import java.util.TreeSet;

public class Demo5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string = "8 10 25 5 3 7";
		System.out.println("排序后的字符串是:" + sortString(string));
	}

	public static String sortString(String str) {
		TreeSet treeSet = new TreeSet();
		String[] datas = str.split(" ");

		for (int i = 0; i < datas.length; i++) {
			int num = Integer.parseInt(datas[i]);
			treeSet.add(num);
		}

		StringBuilder stringBuilder = new StringBuilder();
		Iterator iterator = treeSet.iterator();
		while (iterator.hasNext()) {
			stringBuilder.append(iterator.next() + " ");
		}
		return stringBuilder.toString();

	}
}

用于平时自己复习回顾,如有错误,欢迎指正

个人微信号:yxx85561498,欢迎一起学习交流,努力进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值