• 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)

  • 相关阅读:
    MS SQL入门基础:SQL数据库中的事务
    MS SQL入门基础:删除数据
    MS SQL入门基础:触发器的高级应用
    MS SQL入门基础:SQL Server 安全性管理的途径
    MS SQL入门基础:权限管理
    MS SQL入门基础:打开游标
    MS SQL入门基础:数据库更新添加数据
    MS SQL入门基础:游标、游标的优点和种类
    MS SQL入门基础:创建和管理视图
    MS SQL入门基础:数据库中的连接查询
  • 原文地址:https://www.cnblogs.com/hmy-1365/p/5682108.html
Copyright © 2020-2023  润新知