SortedSet自定义排序

我们知道,集合Set可以存放一系列的对象,比如int,class,而且是无序的,是不可重复的。今天我们来探讨的是:Set可不可以排序,怎样自定义排序规则

首先盗一张图来说明Set的继承关系:

SortedSet自定义排序_第1张图片

我们今天主要讨论SortedSet的用法。
(注意:上图里都是借口,需要用它们的实现类)

下面我们来实现SortedSet的排序:

public class test {
    public static void main(String[] args) {
        TreeSet<String> set=new TreeSet<String>();
        set.add("B");
        set.add("D");
        set.add("A");
        set.add("E");
        set.add("C");
        System.out.println(set);
    }
}

结果是什么呢,是 [A, B, C, D, E] 。。。。
是按字母序排列的,那么如果我想让它倒叙排列呢,这里需要自定义一个排序规则。

//这时TreeSet的一个构造方法
//comparator:这个就是自定义的排序规则
public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

下面我们来测试一下;

public class test {
    public static void main(String[] args) {
    //new 一个自定义Comparator
        TreeSet<String> set=new TreeSet<String>(new MyComparator());
        set.add("B");
        set.add("D");
        set.add("A");
        set.add("E");
        set.add("C");
        System.out.println(set);
    }
}

class MyComparator implements Comparator{
    @Override
    public int compare(Object o1, Object o2) {
        String s1=(String) o1;
        String s2=(String) o2;
        //反序
        return s2.compareTo(s1);
    }
}

结果和显然:[E, D, C, B, A]

这都是很简单的,如果我们用一个自定义class呢,比如一个Person类,要求按照age排序,我们来看一下如何实现:

public class test {
    public static void main(String[] args) {
    //自定义排序规则
        TreeSet<Person> set=new TreeSet<Person>(new MyComparator());
        set.add(new Person("A", 20));
        set.add(new Person("D", 10));
        set.add(new Person("E", 40));
        set.add(new Person("C", 50));
        set.add(new Person("B", 30));
        System.out.println(set);
    }
}

class Person{
    String name;
    int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    @Override
    //重写toString方法,制定输出格式:
    public String toString() {
        return "name:"+name+",age="+age;
    }
}
class MyComparator implements Comparator{
    @Override
    public int compare(Object o1, Object o2) {
        Person p1=(Person) o1;
        Person p2=(Person) o2;
        //自定义比较规则
        return (int) (p1.age-p2.age);
    }
}

结果:
[name:D,age=10, name:A,age=20, name:B,age=30, name:E,age=40, name:C,age=50]

达到了我们想要的结果。

这样,我们就搞定了Set的排序。

你可能感兴趣的:(集合,set,自定义,SortedSet)