(黑马程序员)TreeSet集合总节笔记(一)

来源:互联网 发布:基于nodejs的cms 编辑:程序博客网 时间:2024/05/21 08:03

      TreeSet当你执行add()方法的时候,集合会自动排序,所以是一种有序的集合。 

使用TreeSet有两种方法:

一、元素实现Comparable接口,然后直接通过add方法添加元素即可。

二、创建一个Comparator,并在构造TreeSet的时候传入,如下:

 

//我这里Person为待添加元素
Set<Personpersons = new TreeSet<Person>(new PersonComparator());

 

现在需求很简单,根据Person的优先级字段(Priority)进行排序,Person类代码如下:

 

 

Java代码  

public class Person implements Comparable<SortPerson> {  

  

    private String personName;  

  

    private Integer priority;  

  

    public SortPerson() {  

    }  

  

    public SortPerson(String personName, Integer priority) {  

        this.personName = personName;  

        this.priority = priority;  

    }  

  

    public String getPersonName() {  

        return personName;  

    }  

  

    public void setPersonName(String personName) {  

        this.personName = personName;  

    }  

  

    public Integer getPriority() {  

        return priority;  

    }  

  

    public void setPriority(Integer priority) {  

        this.priority = priority;  

    }  

  

    @Override  

    public int compareTo(SortPerson o) {  

        return priority.compareTo(o.getPriority());  

    }  

}  

 

   测试代码如下:

 

 

Java代码  

@Test  

public void sortPerson() {  

    Set<SortPersonpersons = new TreeSet<SortPerson>();  

  

    persons.add(new SortPerson("001", 1));  

    persons.add(new SortPerson("002", 1));  

    persons.add(new SortPerson("003", 1));  

    assertEquals(3, persons.size());    // ①  

}  

 

    测试并没有通过,在行①,这里实际集合size1,出了什么问题呢?

    soga原来TreeSetadd方法会先调用PersoncompareTo方法判断元素是否重复,因为Priority全部为1,所以TreeSet认为后两个Person是重复的,这样的结果显然不是我们想要的,重新实现compareTo方法如下:

 

 

Java代码  

@Override  

public int compareTo(SortPerson o) {  

    int compare1 = priority.compareTo(o.getPriority());  

    return compare1 == 0 ? this.personName.compareTo(o.personName) : compare1;  

}  

 

再次运行测试,OK了。

这个代码证明了TreeSet集合添加元素时的特点,和比较的特性,判断相等的依据。

原创粉丝点击