zoukankan      html  css  js  c++  java
  • TreeSet的特性

    TreeSet在Set的元素不重复的基础之上引入排序的概念,其中对自身拥有Comparable的元素,可以直接进行排序,比如字符串,按照字母的自然顺序排序,此处说下对于自定义对象排序的方式。

    1、存储元素的类实现Comparable接口

    实现Comparable接口,其中只有一个方法

    compareTo(Object obj)

    obj:是用来比较的对象,也就是前边进入TreeSet的对象

    继续以Person来举例,首先实现Person类,代码如下:

    class Person implements Comparable
    {
        private String name;
        private int age;
    
        public Person(String name, int age)
        {
            this.name = name;
            this.age = age;
        }
            //特别要注意的是此处也是TreeSet识别重复元素的规则,当年龄一样的时候要判断姓名是否相同,否则若年龄相同的话就不能存入TreeSet
        public int compareTo(Object obj)
        {
            if(!(obj instanceof Person))
                throw new RuntimeException("hehe");
            Person p = (Person)obj;
            int ageGap = this.age - p.age; 
            if(ageGap > 0)
                return 1;
            else if(ageGap < 0)
                return -1;
            else
                return this.getName().compareTo(p.getName());
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    
        public void setAge(int age)
        {
            this.age = age;
        }
    
        public String getName()
        {
            return this.name;
        }
    
        public int getAge()
        {
            return this.age;
        }
    }

    2、创建TreeSet时向其中加入Comparator

    当元素不具备比较性时,此时只能为容器添加比较器来解决问题,当元素具备比较性,并且容器具备比较器,此时要以比较器为主。

    继续以Person作为例子

    定义Comparator

    //注意Comparator是一个泛型接口
    class PersonComparator implements Comparator<Person>
    {
        public int compare(Person p1, Person p2)
        {
            int number = p1.getName().compareTo(p2.getName());
                    //先判断姓名,再判断年龄,和Comparable一样的,只比较一个条件会导致另一个条件不同的元素无法存入TreeSet
            if(number == 0)
                return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
            else
                return number;
        }
    }

    如何使用

    public class Test
    {
        public static void main(String[] args)
        {    
                    //TreeSet的构造方法中有用于接收比较器
                    TreeSet<Person> ts = new TreeSet<>(new PersonComparator());
    
            ts.add(new Person("zhangsi", 34));
            ts.add(new Person("zhangsi", 25));
            ts.add(new Person("lisi", 34));
            ts.add(new Person("zhangsi", 567));
            ts.add(new Person("wangwu", 84));
            ts.add(new Person("zhangsi", 23));
    
            Iterator<Person> it = ts.iterator();
    
            while(it.hasNext())
            {
                Person p = it.next();
                System.out.println(p.getName()+"%%%%%"+p.getAge());
            }
        }
    }
  • 相关阅读:
    科目2考试最好的网址
    怎么解决tomcat占用8080端口问题
    JDBC全部分析
    JSP分页技术的实现(利用当前页进行前后加减,并利用href进行当前页面传值,传值当然是那个当前值变量)
    mysql 如何创建一个简单的存储过程
    MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)
    JAVA线程操作常见面试题 包括不使用内部类对多个线程加减1
    JAVA常用设计模式(静态化调用和实例化调用的区别,编辑可见 )
    面试王牌 JAVA并发
    不通过ecplise,只通过文件目录 创建最简单的JSP文件
  • 原文地址:https://www.cnblogs.com/fantasy01/p/3974034.html
Copyright © 2011-2022 走看看