zoukankan      html  css  js  c++  java
  • Java容器(TreeSet)

    TreeSet

    TreeSet是SortedTree的实现类,所以TreeSet里面的元素需要排序,排序方法分为自然排序指定排序

    • TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
    • TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
    • TreeSet 实现了Cloneable接口,意味着它能被克隆。
    • TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。
    • TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

    TreeSet例子

    自然排序
    自定义类对象,继承Comparable接口,实现接口里面的compareTo(Object o)的方法,比较两个类对象,前者大返回1,后者大返回负整数,相等返回0。

    自定义Person类,继承Comparable接口

    package com.cwstd.day3;
    import java.text.Collator;
    import java.util.Comparator;
    import java.util.Locale;
    import java.util.Objects;
    import java.util.stream.Collector;
    //继承Comparable接口
    public class Person implements Comparable {
        private String name;
        private Integer age;
        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
    //实现继承Comparable的compareTo方法
        @Override
        public int compareTo(Object o) {
        Person person=null;
        if(o instanceof Person)
        {
            person=(Person) o;
            Comparator comparator =Collator.getInstance(Locale.CHINA);
            int res=comparator.compare(this.name,person.getName());
            if(res==0)
            {
                res=this.age>person.getAge()?1:(this.age==person.getAge()?0:-1);
    
            }
            return res;
        }
            return 0;
        }
    }
    

    测试类

    package com.cwstd.day3;
    
    import org.junit.Test;
    
    import java.util.TreeSet;
    
    public class TreeSetTest {
        @Test
        public void add()
        {
            TreeSet<Person> treeSet = new TreeSet<>();
            treeSet.add(new Person("从西",12));
            treeSet.add(new Person("啊伟",12));
            for(Person p:treeSet)
            {
                System.out.println(p.getName());
                System.out.println(p.getAge());
            }
        }
    }
    
    

    注意:TreeSet类使用比较类来判断是否相等,并不需要HashSet的hashCode()和equals()方法来判断是否相等。(自定义类时候三个方法最好都加上)


    指定排序
    指定排序是使用三方接口Comparator,不是为TreeSet专门设计的,当指定排序与自然排序同时出现时,生效的是指定排序

    定义指定排序类PersonComparator

    package com.cwstd.day3;
    
    import java.text.Collator;
    import java.util.Comparator;
    import java.util.Locale;
    
    public class PersonComparator implements Comparator {
        @Override
        public int compare(Object o1, Object o2) {
            Person person1=null;
            Person person2=null;
            if(o1 instanceof Person && o2 instanceof Person)
            {
                person1=(Person) o1;
                person2=(Person) o2;
                Comparator comparator = Collator.getInstance(Locale.CHINA);
                int res=comparator.compare(person1.getName(),person2.getName());
                if(res==0)
                {
                    res=person1.getAge()>person2.getAge()?1:(person1.getAge()==person2.getAge()?0:-1);
                }
                return res;
    
            }
            return 0;
        }
    }
    

    测试类

    package com.cwstd.day3;
    
    import org.junit.Test;
    
    import java.util.TreeSet;
    
    public class TreeSetTest {
        @Test
        public void add()
        {
            TreeSet<Person> treeSet1 = new TreeSet<>(new PersonComparator());//传入比较类
            treeSet1.add(new Person("从西",12));
            treeSet1.add(new Person("啊伟",12));
            for(Person p:treeSet1)
            {
                System.out.println(p.getName());
                System.out.println(p.getAge());
            }
        }
    }
    
    
  • 相关阅读:
    ES 分词器简单应用
    ElasticSearch 通过 Kibana 与 ElasticSearch-head 完成增删改查
    linux 通过docker安装 elasticsearch-head
    The container name "/nacos" is already in use by container
    mysql 用户及用户权限管理命令总结-用户添加及添加权限
    docker 安装 ElasticSearch 和 Kibana 及ik 中文分词器
    docker 安装 nacos
    mysql 主从状态查询及恢复
    那些看似牛逼的「快速阅读法」为什么全是错的!?
    新手VS高手,高手是怎么读书的?
  • 原文地址:https://www.cnblogs.com/cwstd/p/14710500.html
Copyright © 2011-2022 走看看