一、实现Comparable接口(用于类之间的排序):
假设有Employee类,有name和salary字段,
需要实现Comparable<T>接口:
public class Employee implements Comparable<Employee> {
private String name;
private double salary;
public Employee() {
}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
/*
* Compares employees by salary
* @param other another Employee object
* return a negative value if this employee has a lower salary than
* otherObject , 0 if the salaries are the same, a positive value otherwise
*/
public int compareTo(Employee other) {
return Double.compare(salary, other.salary);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
假设希望根据雇员的薪水进行比较,要实现compareTo方法:
public int compareTo(Object otherObject)
{
Employee other = (Employee) otherObject;
return Double.compare(salary, other.salary);
}
我们来测试一下,这个比较排序是否能成功:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Employee[] staff = new Employee[5];
staff[0] = new Employee("Harry Hacker", 35000);
staff[1] = new Employee("Carl Cracker", 75000);
staff[2] = new Employee("Tony Tester", 38000);
staff[3] = new Employee("Tony Bool", 48000);
staff[4] = new Employee("June Bo", 48001);
Arrays.sort(staff);
// print out information about all Employee objects
for (Employee e : staff) {
System.out.println("name=" + e.getName() + " , salary=" + e.getSalary());
}
}
}
输出结果为:
name=Harry Hacker , salary=35000.0
name=Tony Tester , salary=38000.0
name=Tony Bool , salary=48000.0
name=June Bo , salary=48001.0
name=Carl Cracker , salary=75000.0
排序是可以的。
所以,排序可以实现Comparable接口,然后自定义compareTo方法即可(因为sort方法要有提供对象比较的方式)。
二、使用比较器(comparator)作为sort的参数(用于单个类型的排序):
比较器实现了Comparator接口
如: 需要按照字符的长度递增来进行排序:
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
String[] friends = { "Peter", "Paulllll", "Mary" };
Arrays.sort(friends, new LengthComparator());
for (String f : friends) {
System.out.print(f + " ");
}
}
static class LengthComparator implements Comparator<String>
{
public int compare(String first, String second) {
return first.length()- second.length();
}
}
}
输出结果为:
Mary Peter Paulllll
排序按字符长度递增顺序。
如果只是需要按照字符的字典顺序排序的话,则不需要实现Comparator:
public class Test {
public static void main(String[] args) {
String[] friends = { "Peter", "Paulllll", "Mary","ziqizh" ,"yoyo"};
Arrays.sort(friends);
for (String f : friends) {
System.out.print(f + " ");
}
}
static class LengthComparator implements Comparator<String>
{
public int compare(String first, String second) {
return first.length()- second.length();
}
}
}
输出结果为:
Mary Paulllll Peter yoyo ziqizh
C++也有类似的排序,单个类型或者是结构体都可以,自己写一个比较函数cmp,作为sort的参数排序即可。
Java内容具体可以参照《Java核心技术卷1》6.2章节