TreeSet

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

 

 1 package com.tutorialspoint;
 2 
 3 import java.util.TreeSet;
 4 import java.util.Iterator;
 5 
 6 public class TreeSetDemo {
 7    public static void main(String[] args) {
 8    // creating a TreeSet 
 9    TreeSet <Integer>treeadd = new TreeSet<Integer>();
10    TreeSet <Integer>treetailset = new TreeSet<Integer>();
11      
12    // adding in the tree set
13    treeadd.add(1);
14    treeadd.add(2);
15    treeadd.add(3);
16    treeadd.add(4);
17    treeadd.add(5);
18    treeadd.add(6);
19    treeadd.add(7);
20    treeadd.add(8);
21       
22    // creating tail set
23    treetailset=(TreeSet)treeadd.tailSet(4); 
24       
25    // create iterator
26    Iterator iterator;
27    iterator = treetailset.iterator();
28      
29    // displaying the Tree set data
30    System.out.println("Tree tail set data: ");     
31    while (iterator.hasNext()){
32    System.out.println(iterator.next() + " ");
33    }
34    }     
35 }
TreeSet示例

 public SortedSet<E> tailSet(E fromElement)

转载于:https://www.cnblogs.com/hmy-1365/p/5682108.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值