TreeSet和TreeMap实现排序

TreeSet
TreeSet类是Set接口的一个实现类,确保元素实体可以排序,不同于HashSet(也是Set接口的实现类),TreeSet不需要重写hashcode和equals方法。
TreeSet的构造方法有以下几种
TreeSet和TreeMap实现排序_第1张图片
那么就可以有两种排序方式
1. java.lang.Comparble+compareTo
new TreeSet()
用这种方法必须要求实体类实现Comparable接口,也就是说要求添加到TreeSet中的元素是可排序的
2. java.util.Comparator +compare
new TreeSet(Comparator

//person实体类
public class Person {
    private String name;
    private int handsome;

    public Person() {
        // TODO Auto-generated constructor stub
    }

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

    public String getName() {
        return name;
    }

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

    public int getHandsome() {
        return handsome;
    }

    public void setHandsome(int handsome) {
        this.handsome = handsome;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", handsome=" + handsome + "]\n";
    }
}
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
    public static void main(String[] args) {
        Person p1=new Person("depp",100);
        Person p2=new Person("tom",90);
        Person p3=new Person("jack",50);

        TreeSet<Person> ts=new TreeSet<Person>(new Comparator<Person>(){

            public int compare(Person o1, Person o2) {

                return o1.getHandsome()-o2.getHandsome();//升序
            }

        });

        //TreeSet在添加数据时排序,而Collections的sort方法是在元素添加完成以后排序
        ts.add(p1);
        ts.add(p2);
        ts.add(p3);

        System.out.println(ts);

        //改变数据,排序不会改变
        p3.setHandsome(120);
        System.out.println(ts);

    }
}

输出结果为:
[Person [name=jack, handsome=50], Person [name=tom, handsome=90], Person [name=depp, handsome=100] ]
[Person [name=jack, handsome=120], Person [name=tom, handsome=90], Person [name=depp, handsome=100] ]

排序结果没有改变,是因为TreeSet在添加元素的时候进行排序,需要注意,数据更改不会影响原来的顺序
还有一点需要注意的是,TreeSet中不可以数据重复,所以一般不修改数据,为了确保这一点,我们可以在Person类为属性加上final关键字,删除setter方法,如下

private final String name;
    private final int handsome;

    public Person() {
        name=null;
        handsome=0;
    }

TreeMap
TreeMap实现了Map接口,同样要求元素可以排序,同上TreeSet
TreeSet和TreeMap实现排序_第2张图片
利用上面定义的Person类,TreeMapDemo测试,见代码

TreeMap<Person,String> tm=new TreeMap<Person,String>(new Comparator<Person>(){
        public int compare(Person o1, Person o2) {
            return o1.getHandsome()-o2.getHandsome();//升序
        }
    });

    tm.put(p1,"www");
    tm.put(p2,"www");
    tm.put(p3,"www");

    System.out.println(tm);
    //也可以用set进行输出
    Set<Person> set=tm.keySet();
    System.out.println(set);

输出结果为:(注意:换行格式手动调整过)
{Person [name=jack, handsome=50]=www,
Person [name=tom, handsome=90]=www,
Person [name=depp,handsome=100]=www}
[Person [name=jack, handsome=50], Person [name=tom, handsome=90], Person [name=depp, handsome=100] ]

与TreeSet一样,TreeMap也是在添加元素时进行排序

你可能感兴趣的:(排序,JavaSE,TreeMap,TreeSet)