package com.collection.set;
 
import java.util.TreeSet;
 
import org.junit.Test;
 
/*
集合的体系:
----| Collection: 单例集合的根接口
-------| List:实现了List接口的集合类,具备的特点:有序,可重复;
----------| ArrayList:底层是维护了一个Object数组实现的;特点:查询速度快,增删慢;
----------| LinkedList:底层是使用了链表数据结构实现的;特点:查询速度慢,增删快;
----------| Vector(了解即可):底层也是维护了一个Object数组实现的,与ArrayList是一样的;但是Vector是
				线程安全的,操作效率低,所以被ArrayList取代了;ArrayList不是线程同步的,操作效率高;
				
-------| Set:实现了Set接口的集合类,具备的特点:无序,不可重复;
----------| HashSet:底层是使用了哈希表来支持的;特点:存取速度快;
----------| TreeSet:底层使用了红-黑树的数据结构,红-黑树是一种特定类型的二叉树,规则是左小右大;
					如果元素具备自然顺序的特性,那么就按照元素的自然顺序进行排序存储;
					自然顺序:abcd,1234等;
					
	TreeSet注意事项:
		1、往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素本身的自然顺序特性进行存储;
		2、如果元素本身不具备自然 顺序的特性,那么该元素所属的类必须要实现Comparable接口,并重写compareTo()
			方法,把元素的比较规则定义在compareTo()方法上;
		3、如果比较元素的时候,compareTo()方法返回的是0,那么该元素就被视为重复元素,不允许添加;	
	无序:指添加元素的顺序和取出元素的顺序是不一致的;				
*/
 
 
class Person implements Comparable{
	
	int id;			// 编号
	String name;	// 姓名
	int salary;		// 薪水
	
	public Person() {
	
	}
	
	public Person(int id, String name, int salary) {
		this.id = id;
		this.name = name;
		this.salary = salary;
	}
 
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", salary=" + salary + "]";
	}
 
	// 定义元素与元素之间的比较规则;该方法由TreeSet调用,不需要我们自己调用;
	@Override
	public int compareTo(Object o) {
		Person p = (Person) o;
		
		// 查看哪两个元素进行比较:
		System.out.println(this.name + " compare " + p.name);
		
		// 负数、0、正数,分别表示当前对象小于、等于、大于指定对象;
		return this.salary - p.salary;
	}
 
}
 
public class Demo6 {
 
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test1(){
		TreeSet t = new TreeSet();
		t.add(1);
		t.add(33);
		t.add(12);
		t.add(9);
		System.out.println("集合中的元素:" + t); // 集合中的元素:[1, 9, 12, 33]
		
		TreeSet t2 = new TreeSet();
		t2.add('q');
		t2.add('w');
		t2.add('e');
		t2.add('r');
		System.out.println("集合中的元素:" + t2); // 集合中的元素:[e, q, r, w]
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Test
	public void test2(){
		TreeSet t = new TreeSet();
		t.add(new Person(1, "陈一", 600));
		t.add(new Person(2, "冯二", 700));
		t.add(new Person(3, "张三", 300));
		t.add(new Person(4, "李四", 500));
		t.add(new Person(5, "王五", 200));
		t.add(new Person(6, "赵六", 900));
		t.add(new Person(7, "田七", 900));
		
		// 默认情况下自定义对象元素无法确定比较规则,所以会报异常:java.lang.ClassCastException: 
		// com.collection.set.Person cannot be cast to java.lang.Comparable
		// 当Person类实现了Comparable接口,重写了compareTo()方法,并在该方法中指定比较的规则是
		// 按照薪水排序的,那么自定义对象元素就可以进行排序了;
		System.out.println("集合中的元素:" + t); 
	}
	
}