TreeSet集合的特点:
两种排序方式:
方式一:让集合中的元素自身具有比较性,这就让加入到TreeSet集合中的对象必须实现comparable接口重写compareTo(Object obj)方法
这种方式也成为元素的自然排序或默认排序。(但是如果排序的元素不是本人写的,别人写的没有实现comparable接口时想排序使用第二种方式)
方式二:让集合容器具有比较性,自定义一个比较器实现comparator接口,重写compare(Object o1,Object o2)方法,在初始化TreeSet容器对象将这个
自定义的比较器作参数传给容器的构造函数,使得集合容器具有比较性,使用这种方式的优先级高于方式一,
方式一实例:
1 package com.collection; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 public class TreeSetTest { 7 8 public static void main(String[] args) { 9 TreeSet<Person> treeSet = new TreeSet<Person>(); 10 treeSet.add(new Person("zhangsan", 12)); 11 treeSet.add(new Person("zhangsan", 16)); 12 treeSet.add(new Person("lisi", 16)); 13 treeSet.add(new Person("wangwu", 20)); 14 treeSet.add(new Person("ada", 20)); 15 Iterator<Person> it = treeSet.iterator(); 16 while(it.hasNext()){ 17 Person p = it.next(); 18 System.out.println(p.toString()); 19 } 20 } 21 } 22 23 //集合元素实现comparable接口 重写compareTo()方法 24 class Person implements Comparable<Person>{ 25 26 private String name; 27 private int age; 28 29 public Person(String name, int age) { 30 super(); 31 this.name = name; 32 this.age = age; 33 } 34 public String getName() { 35 return name; 36 } 37 public void setName(String name) { 38 this.name = name; 39 } 40 public int getAge() { 41 return age; 42 } 43 public void setAge(int age) { 44 this.age = age; 45 } 46 47 @Override 48 public int compareTo(Person o) { 49 int result = this.name.compareTo(o.getName()); 50 if(result == 0){ 51 return Integer.valueOf(age).compareTo(new Integer(o.getAge())); 52 } 53 return result; 54 } 55 56 @Override 57 public String toString() { 58 return this.name+"---"+this.age; 59 } 60 61 }
方式二实例:
1 package com.collection; 2 3 import java.util.Collections; 4 import java.util.Comparator; 5 import java.util.Iterator; 6 import java.util.TreeSet; 7 8 public class TreeSetTest { 9 10 public static void main(String[] args) { 11 //用Collections.reverseOrder()将比较结果反排列 12 TreeSet<Person> treeSet = new TreeSet<Person>(Collections.reverseOrder(new MyComparator())); 13 treeSet.add(new Person("zhangsan", 12)); 14 treeSet.add(new Person("zhangsan", 16)); 15 treeSet.add(new Person("lisi", 16)); 16 treeSet.add(new Person("wangwu", 20)); 17 treeSet.add(new Person("ada", 20)); 18 Iterator<Person> it = treeSet.iterator(); 19 while(it.hasNext()){ 20 Person p = it.next(); 21 System.out.println(p.toString()); 22 } 23 } 24 } 25 26 class MyComparator implements Comparator<Person>{ 27 28 @Override 29 public int compare(Person o1, Person o2) { 30 int result = o1.getName().compareTo(o2.getName()); 31 if(result == 0){ 32 return new Integer(o1.getAge()).compareTo(new Integer(o2.getAge())); 33 } 34 return result; 35 } 36 37 } 38 39 //集合元素实现comparable接口 重写compareTo()方法 40 class Person implements Comparable<Person>{ 41 42 private String name; 43 private int age; 44 45 public Person(String name, int age) { 46 super(); 47 this.name = name; 48 this.age = age; 49 } 50 public String getName() { 51 return name; 52 } 53 public void setName(String name) { 54 this.name = name; 55 } 56 public int getAge() { 57 return age; 58 } 59 public void setAge(int age) { 60 this.age = age; 61 } 62 63 @Override 64 public int compareTo(Person o) { 65 int result = this.name.compareTo(o.getName()); 66 if(result == 0){ 67 return Integer.valueOf(age).compareTo(new Integer(o.getAge())); 68 } 69 return result; 70 } 71 72 @Override 73 public String toString() { 74 return this.name+"---"+this.age; 75 } 76 77 }
排序性:加入到TreeSet集合中的对象必须具有比较性,也就是对象事项comparable接口覆盖compareTo(Object obj)方法,
判断集合中元素是否相同的标准就是compareTo()中返回值是不是return 0;
如果只加入一个对象到TreeSet中,无需比 该对象不实现comparable接口也不抱错 但这样就没有意义了
底层结构:二叉树,由于TreeSet集合底层结构是二叉树,那么compareTo()中返回值return 1时就会按照插入顺序排序,
相反 return -1,就会按插入的顺序凡序
1 class MyComparator implements Comparator<Person>{ 2 3 @Override 4 public int compare(Person o1, Person o2) { 5 6 return 1; 7 //结果 8 /*zhangsan---12 9 zhangsan---16 10 lisi---16 11 wangwu---20 12 ada---20*/ 13 } 14 15 }
唯一性条件:compareTO() return 0;如果相同,则元素不会被加入到集合中....