Java: Comparable和Comparator

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())));

猜你喜欢

转载自blog.csdn.net/baidu_25104885/article/details/87919488