码迷,mamicode.com
首页 > 其他好文 > 详细

TreeSet

时间:2016-07-19 13:10:48      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

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中只能存储一个该类型的对象实例,请看程序示例:

 

TreeSet

标签:

原文地址:http://www.cnblogs.com/hmy-1365/p/5682108.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!