TreeSet

作者: 像天空的鸽子 | 来源:发表于2019-08-01 21:25 被阅读0次
    TreeSet存储原理.png

    treeSet添加自定义元素:支持排序的集合类

    treeSet要注意的事项:
    1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
    2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
    的比较规则定义在compareTo(T o)方法上。

    1. 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加.(注意:TreeSet与HashCode、equals方法是没有任何关系。)

    2. 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个
      比较器。

    3. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器
      那么是以比较器的比较规则优先使用。

    如何自定义定义比较器: 自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可。

    自定义比较器的格式 :

    class 类名 implements Comparator{

    }

    推荐使用:使用比较器(Comparator)。

    package cn.itcastset;
    
    import java.util.Comparator;
    import java.util.TreeSet;
    
    class  Emp implements Comparable<Emp>{
        
        int id;
        
        String name;
        
        int salary;
    
        public Emp(int id, String name, int salary) {
            super();
            this.id = id;
            this.name = name;
            this.salary = salary;
        }
        
        @Override
        public String toString() {
            return "{ 编号:"+  this.id+" 姓名:"+ this.name+" 薪水:"+ this.salary+"}";
        }
    
        //@Override //元素与元素之间的比较规则。
        // 负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 
        public int compareTo(Emp o) {
    //      System.out.println(this.name+"compare"+ e.name);
            return this.salary- o.salary;
        }   
    }
    
    
    //自定义一个比较器
    class MyComparator implements Comparator<Emp>{
    
        @Override
        public int compare(Emp o1, Emp o2) {
            return o1.id-o2.id;
        }
        
        //根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 
        /*@Override
        public int compare(Object o1, Object o2) {
            Emp e1 = (Emp) o1;
            Emp e2 = (Emp) o2;
            return e1.id - e2.id;
        }*/
        
        
    }
    
    
    
    
    public class Demo6 {
        
        public static void main(String[] args) {
            //创建一个比较器对象
            MyComparator comparator = new MyComparator();
            //创建TreeSet的时候传入比较器
            TreeSet tree = new TreeSet(comparator);
            
            tree.add(new Emp(110, "老陆", 100));
            tree.add(new Emp(113, "老钟", 200));
            tree.add(new Emp(220, "老汤", 300));
            tree.add(new Emp(120, "老蔡", 500));
            System.out.println("集合的元素:"+tree);
            
        }
    }
    

    Comparable接口支持排序

    TreeSet是可以对字符串进行排序 的, 因为字符串已经实现了Comparable接口。

    字符串的比较规则:

    情况一: 对应位置有不同的字符出现, 就比较的就是对应位置不同的字符。

    情况 二:对应位置上 的字符都一样,比较的就是字符串的长度。

    package cn.itcastset;
    
    import java.util.Iterator;
    import java.util.TreeSet;
    /*
    需求:将字符串中的数值进行排序。
            例如String str="8 10 15 5 2 7"; ---->   "2 5 7 8 10 15"
    */
    
    public class Demo8 {
        
        public static void main(String[] args) {
            String str="8 10 15 5 2 7";
            String[] datas = str.split(" ");
            
            TreeSet tree = new TreeSet();
            for(int i = 0 ; i<datas.length ; i++){
                tree.add(Integer.parseInt( datas[i])); // 字符串转int类型数据是需要使用Integer.parseInt()
            }
            
            //遍历treeSet的元素拼接成对应的字符串
            Iterator it = tree.iterator();
            while(it.hasNext()){
                System.out.print(it.next()+" ");
            }
            
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:TreeSet

          本文链接:https://www.haomeiwen.com/subject/nxkhdctx.html