标签:
TreeSet是依靠TreeMap来实现的。
TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,默认是按照自然排序进行排列,意味着TreeSet中的元素要实现Comparable接口。
或者有一个自定义的比较器。我们可以在构造TreeSet对象时,传递实现Comparator接口的比较器对象
示例一、
import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { Set ts=new TreeSet(); ts.add("abc"); ts.add("kli"); ts.add("ijm"); Iterator it=ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
打印结果:
abc
ijm
kli
结论:我们向treeSet集合中添加的是一个字符串类型的对象,因为String类实现了Comparable接口,所以结果按照字母进行排序打印
自然排序情况下,一个TreeSet中只允许存放同一类型的多个元素,这里要求不是自定义的类
如果有多个类的对象都加入到TreeSet集合中,就会发生异常
import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { Set ts=new TreeSet(); ts.add("abc"); ts.add("kli"); ts.add("ijm"); ts.add(new String("dd")); ts.add(new Integer(100)); Iterator it=ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
就会发生异常
而对于自定义的类,它的对象只能存放一个,而且实现类不需要实现Comparable接口。
如果想要存放多个,则该类需要实现Comparable接口。不实现Comparable接口就会发生java.lang.ClassCastException异常
因此, 想要能够进行客户化排序,必须实现比较器 。
实现Comparable接口,就要实现 compareTo()方法 。而TreeSet 又不存储相同的元素,这就要求自定义的类重写hashCode()和equals()方法 :
如果我们自己定义的一个类的对象要加入到TreeSet当中,那么这个类必须要实现Comparable接口。
下面我们介绍一种我们自定义的类,以及如何去实现Comparable接口。
自定义的学生类
1 public class Student implements Comparable{ 2 private String name; 3 private Integer age; 4 5 6 7 public Student() { 8 super(); 9 } 10 public Student(String name, Integer age) { 11 this.name = name; 12 this.age = age; 13 } 14 public String getName() { 15 return name; 16 } 17 public void setName(String name) { 18 this.name = name; 19 } 20 public Integer getAge() { 21 return age; 22 } 23 public void setAge(Integer age) { 24 this.age = age; 25 } 26 27 public String toString() { 28 return "Student [name=" + name + ", age=" + age + "]"; 29 } 30 public int compareTo(Object o) { 31 Student other=(Student)o; 32 if(this.name.compareTo(other.getName())>0){ 33 return 1; 34 } 35 if(this.name.compareTo(other.getName())<0){ 36 return -1; 37 } 38 if(this.getAge().intValue()>other.getAge().intValue()){ 39 return 1; 40 } 41 if(this.getAge().intValue()<other.getAge().intValue()){ 42 return -1; 43 } 44 return 0; 45 } 46 47 public boolean equals(Object o){ 48 if(this==o){ 49 return true; 50 } 51 if(!(o instanceof Student)){ 52 return false; 53 } 54 final Student other=(Student)o; 55 if(this.name.equals(other.getName())&&this.age.equals(other.getAge())){ 56 return true; 57 }else{ 58 return false; 59 } 60 61 } 62 63 public int hashCode(){ 64 int result; 65 result=(name==null?0:name.hashCode()); 66 result=37*result+(age==null?0:age.hashCode()); 67 return result; 68 } 69 70 }
测试结果
1 Set ts=new TreeSet(); 2 Student stu=new Student(); 3 stu.setAge(new Integer(29)); 4 stu.setName("admin"); 5 ts.add(stu); 6 ts.add(new Student(new String("admin"),new Integer(29)));
1 Student [name=admin, age=29]
结论:TreeSet 不存储相同的元素,上面我们添加的两个对象其实是一个对象
由于在Student类中实现类了compareTo()方法,输出结果是排序的,首先按照name排序,然后再按照age排序:
TreeSet的主要性质
1、TreeSet中不能有重复的元素;
2、TreeSet具有排序功能;
3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法;(这条性质比较重要,如果读者对TreeSet内部机制比较熟悉的话这条性质应该不难理解.
4、对于java类库中定义的类,TreeSet可以直接对其进行存储,如String,Integer等(因为这些类已经实现了Comparable接口);
5、对于自定义类,如果不做适当的处理,TreeSet中只能存储一个该类型的对象实例,请看程序示例:
标签:
原文地址:http://www.cnblogs.com/hmy-1365/p/5682108.html