• 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());
            }
        }
    }
  • 相关阅读:
    类别的三个作用
    require()
    commonJS
    ng-app&data-ng-app
    《css网站布局实录》(李超)——读书札记
    高性能JS(读书札记)
    两个同级div重叠的情况
    前端性能优化
    正则表达式
    ajax
  • 原文地址:https://www.cnblogs.com/fantasy01/p/3974034.html
Copyright © 2020-2023  润新知