import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; public class Test1 { public static void main(String[] args) { List<String> strs = new ArrayList<String>(); strs.addAll(Arrays.asList("sss","eee","ddd")); Collections.sort(strs); System.out.println(strs); List<Person> persons = new LinkedList<Person>(); persons.addAll(Arrays.asList(new Person("sss",20), new Person("yyy",34), new Person("hhh",12))); Collections.sort(persons);//编译报错 System.out.println(persons); } }
问题分析:why编译不通过呢,问题定位在String和Person对象
查看String的源码,原来是String自身实现Comparable接口,然而Person类没有实现Comparable接口
public final class String implements java.io.Serializable, Comparable<String>, CharSequence
查看源码:Comparable 和Comparator都是泛型接口
Comparable
1. 类的继承关系
public interface Comparable<T>
说明:Comparable就是一个泛型接口,很简单。
2. compareTo方法
public int compareTo(T o);
说明:compareTo方法就构成了整个Comparable源码的唯一的有效方法。
Comparator
1. 类的继承关系
public interface Comparator<T>
说明:同样,Comparator也是一个泛型接口,很简单。
2. compare方法
int compare(T o1, T o2);
说明:Comparator接口中一个核心的方法。
3. equals方法
boolean equals(Object obj);
说明:此方法是也是一个比较重要的方法,但是一般不会使用,可以直接使用Object对象的equals方法(所有对象都继承自Object)。
解决办法:按年龄从小到大,name按ascII排序
方案一、Person同样实现Comparable<Person>接口,实现Compareto()方法
Person implements Comparable<Person>
方案二、Collections.sort()传递比较,相比方案一比较灵活,可以友好的定义各种比较器
Collections.sort(persons, new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { if(p1.age < p2.age) { return -1; }else if (p1.age == p2.age) { return p1.name.compareTo(p2.name); }else { return 1; } } });