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());
        }
    }
}

原文地址:https://www.cnblogs.com/cwstd/p/14710500.html