14、集合--TreeSet的使用和相关说明

 

TreeSet是SortedSet接口的唯一实现

可以确保集合元素处于排序状态

 

TreeSet并不是根据元素的插入顺序进行排序的

而是根据元素实际的值进行排序

 

与HashSet集合采用hash算法来决定元素的存储位置

TreeSet采用红黑树的数据结构进行排序处理

 

 

Treeset支持两种排序方法

1、自然排序

2、定制排序

 

需要实现CompareTo 接口方法
public int compareTo()
TressSet会调用每个元素的该方法比较,进而确定在集合中的位置
返回0 代表相等,返回负数当前元素小,整数当前元素属大
会增加系统的负担

 

测试:

public class Person implements Comparable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public  Person(){

    }

    public boolean equals(Object obj) {
        if (this == obj)
            return  true;
        if (obj == null)
            return  false;
        if (getClass() != obj.getClass())
            return false;

        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null){
            if (other.name != null){
                return false;
            }
        }else  if (!name.equals(other.name)){
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0:name.hashCode());
        return result;
    }

    @Override
    public int compareTo(Object o) {

        //按名字排序
        if (o instanceof Person){
            Person person = (Person) o;
            return this.name.compareTo(person.name);
        }else {
            throw  new ClassCastException("不能进行强制类型转换");
        }
    }
}

 

    public static void main(String[] args) {

        TreeSet set = new TreeSet();

        set.add(new Person("aa",4));
        set.add(new Person("cc",14));
        set.add(new Person("ee",2));
        set.add(new Person("bb",22));
        set.add(new Person("dd",12));

        Iterator it = set.iterator();
        while(it.hasNext()){
            Object o = it.next();
            System.out.println(o);
        }
    }

 

如果要按照年龄进行排序:

此时直接修改Person中的方法:

    @Override
    public int compareTo(Object o) {
        //按照年龄排序
        if (o instanceof  Person){
            Person p = (Person) o;
            return this.age - p.age;
        }else {
            throw  new ClassCastException("不能进行强制类型转换");
        }
    }

此时的运行结果:

 

 

直接写compareTo方法

此时的Person不需要实现Comparable接口

public static void main(String[] args) {

Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {

if (o1 instanceof Person && o2 instanceof Person){
Person p1= (Person) o1;
Person p2 = (Person) o2;

return p1.getAge() - p2.getAge();
}else {
throw new ClassCastException("不能进行强制类型转换");
}
}
};

TreeSet set = new TreeSet(comparator);

set.add(new Person("aa",4));
set.add(new Person("cc",14));
set.add(new Person("ee",2));
set.add(new Person("bb",22));
set.add(new Person("dd",12));

Iterator it = set.iterator();
while(it.hasNext()){
Object o = it.next();
System.out.println(o);
}
}

 

 

 

posted @ 2019-05-11 23:26  MrChengs  阅读(270)  评论(0编辑  收藏  举报