我们知道,集合Set可以存放一系列的对象,比如int,class,而且是无序的,是不可重复的。今天我们来探讨的是:Set可不可以排序,怎样自定义排序规则
首先盗一张图来说明Set的继承关系:
我们今天主要讨论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的排序。
原文地址:http://blog.csdn.net/nsgsbs/article/details/44871303