Comparable接口
Arrays类的sort可以对对象数组排序,前提是对象所属的类必须实现Comparable接口。
public interface Comparable
{
int compareTo(Object other);
}
public class Employee implements Comparable<Employee>
{
private String name;
private double salary;
...
public int compareTo(Employee other)
{
return Double.compare(salary, other.salary);
}
}
public class Test
{
public static void main(String[] args)
{
Employee[] staff = new Employee[2];
staff[0] = new Employee("Tom", 10000);
staff[1] = new Employee("Jerry", 20000);
Arrays.sort(staff);
for (Employee e : staff)
System.out.println("name = " + e.getName() + ", salary = " + e.getSalary());
}
}
Comparator接口
String类实现了Comparable<String>,String.compareTo按字典顺序比较字符串。若想换一种比较方式,按长度递增的顺序排序,可以在集合外实现Comparator接口。
public interface Comparator<T>
{
int compare(T first, T second);
}
//定义一个实现Comparator<String>的类
class LengthComparator implements Comparator<String>
{
public int compare(String first, String second)
{
return first.length() - second.length();
}
}
//具体比较时,需要创建一个实例
Comparator<String> comp = new LengthComparator();
if (comp.compare(words[i], words[j]) > 0) ...
Comparator包含一些静态方法来创建比较器
Arrays.sort(people, Comparator.comparing(Person::getName));
Arrays.sort(people, Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName));
Arrays.sort(people, Comparator.comparingInt(p -> p.getName().length()));
Arrays.sort(people, Comparator.comparing(Person::getName,
(s, t) -> Integer.compare(s.length(), t.length())));