TreeSet
如果元素具备自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
public class Demo1 {
public static void main(String[] args) {
TreeSet tree1 = new TreeSet();
tree1.add(1);
tree1.add(10);
tree1.add(7);
tree1.add(19);
tree1.add(9);
System.out.println("tree1:"+tree1);
TreeSet tree2 = new TreeSet();
tree2.add('b');
tree2.add('f');
tree2.add('a');
tree2.add('c');
System.out.println("tree2:"+tree2);
}
}
TreeSet的实现原理:
当三个结点不能形成分支的时候,应当调整,类似二叉平衡书,每个结点的左右分支之差不能大于1()见下图:
set.add(new Emp(110,“老陆”,100));
set.add(new Emp(113,“老汤”,300));
set.add(new Emp(128,“老蔡”,350));
set.add(new Emp(188,“老张”,400));
treeset添加自定义元素:
treeset要注意的事项:
1、往treeset添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
2、往treeset添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
的比较规则定义在compareto(T o)方法中。
3、如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加(在TreeMap中如果重复,就只取代值)。(注意:TreeSet与HashCode、equals方法是没有任何关系的)
4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
(1)实现Comparable接口:
package TreeSet;
import java.util.TreeSet;
/**
* treeset添加自定义元素:
*
* treeset要注意的事项:
* 1、往treeset添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
* 2、网treeset添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
* 的比较规则定义在compareto(T o)方法中。
* 3、如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法是没有任何关系的)
* 4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
* 5、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,在创建TreeSet对象的时候也传入了比较器,那么是
* 以比较器的比较规则优先使用。
* 如何自定义定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在Compare方法内即可。
* 自定义比价器的格式:
* class 类名 implements Comparator{
* public int compare(Object o1,Object O2){
* }* }
* Comparator comparator = new Comparator();
* TreeSet tree = new TreeSet(comparator);//带参的构造方法,传入比较器对象
* 推荐使用:比较器(Comparator):更好的提高代码复用性
*/
public class Demo2 {
public static void main(String[] args){
TreeSet set = new TreeSet();
set.add(new Emp(113, "老钟", 200));
set.add(new Emp(110, "老路", 100));
set.add(new Emp(113, "老唐", 300));
set.add(new Emp(113, "老菜", 500));
set.add(new Emp(114, "老蔡", 500)); //添加失败
set.add(new Emp(115, "老杨", 350));
System.out.println("集合的元素(没有老蔡):"+set);
}
}
class Emp implements Comparable{
int id;
String name;
int salary;
public Emp(int id, String name, int salary){
this.id = id;
this.name = name;
this.salary = salary;
}
public String toString(){
return "{编号:" + this.id + " 姓名:" + this.name + " 薪水:" + this.salary + "}";
}
//负整数,零或正整数,根据此对象是小于,等于还是大于指定对象。
public int compareTo(Object obj){
Emp e = (Emp)obj;
System.out.println(this.name+"compare"+e.name);
return this.salary - e.salary; //升序
}
}
(2)传入比较器
package TreeSet;
import java.util.Comparator;
import java.util.TreeSet;
public class Demo3 {
public static void main(String[] args){
//创建一个比较器对象
MyComparator comparator = new MyComparator();
//创建TreeSet的时候传入比较器
TreeSet set = new TreeSet(comparator);
set.add(new Person(1, "小杨"));
set.add(new Person(2, "小张"));
set.add(new Person(1, "小李")); //添加失败
set.add(new Person(6, "小孙"));
System.out.println("集合的元素:"+set);
}
}
class Person{
int id;
String name;
public Person(int id, String name){
this.id = id;
this.name = name;
}
public String toString(){
return "{编号:" + this.id + " 姓名:" + this.name + "}";
}
}
class MyComparator implements Comparator{
//根据第一个参数小于,等于或者大于第二个参数分别返回负整数,零或正整数。
public int compare(Object obj1, Object obj2){ //返回的如果是0,则视为重复元素,添加失败。
Person p1 = (Person)obj1;
Person p2 = (Person)obj2;
return p1.id - p2.id;
}
}
如何自定义定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在Compare方法内即可。
自定义比价器的格式:
class 类名 implements Comparator{
public int compare(Object o1,Object O2){
}
}
Comparator comparator = new Comparator();
TreeSet tree = new TreeSet(comparator);//带参的构造方法,传入比较器对象 推荐使用:比较器(Comparator)
TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。 字符串的比较规则:
情况一:对应位置有不同的字符出现,比较的就是对应位置上的字符。
情况二:对应位置上的字符都一样,比较的就是字符串的长度。
public class Demo3 {
public static void main(String[] args) {
TreeSet tree = new TreeSet();
tree.add("abccccccc");
tree.add("abw");
tree.add("ab");
//可以添加成功, 因为字符串String类已经实现了Comparable这个接口
System.out.println(tree);
}
}
练习:
需求:将字符串中的数值进行排序
如:String str = “8 10 15 5 2 7”---->“2 5 7 8 10 15”
package TreeSet;
import java.util.Iterator;
import java.util.TreeSet;
/**
* 需求:将字符串中的数值进行排序
* 如:String str = "8 10 15 5 2 7"---->"2 5 7 8 10 15"
*/
public class Demo5 {
public static void main(String[] args){
String str = "8 10 15 5 2 7";
String[] arr = str.split(" ");
TreeSet<Integer> set = new TreeSet<Integer>();
int len = arr.length;
for(int i=0; i<len; i++){
set.add(Integer.valueOf(arr[i])); //数字字符串转换为整数(用Integer.parseInt()也可以)
}
Iterator it = set.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
}