java中Comparable接口和Comparator接口的使用

      把多个对象放进数组,欲对该对象数组进行排序,需要前提条件(若是基本数据类型的数组可直接用Arrays.sort()对其进行排序),要么数组中的对象所属的类实现了Comparable接口并覆写CompareTo()方法,直接执行Arrays.sort(数组)即可排序,要么单独定制一个排序规则类,该类实现comparator接口并覆写compare()方法,执行Arrays.sort(数组, 排序规则类的对象)也可以进行排序。

      在java的集合API中也将看到这两种接口的靓影,用红布先遮起来吧,到时再掀!

      一、下面首先看实现Comparable接口的方式,思路为:Employee类实现Comparable接口,并覆写了compareTo()方法,在方法中指定按工资由低到高排序,注意现在一般推荐使用泛型化的Comparable接口,老版本的不推荐使用了,创建一个存放3个Employee对象的数组,对该数组排序,可以看到排序效果,代码实现:


<span style="font-size:14px;">import java.util.Arrays;</span>
<span style="font-size:14px;">public class EmployeeSortTest
{
	public static void main(String[] args)
	{
		Employee[] employeeArray = new Employee[3];
		employeeArray[0] = new Employee("001", 5288);
		employeeArray[1] = new Employee("002", 5211);
		employeeArray[2] = new Employee("003", 5014);

		Arrays.sort(employeeArray);
		for(Employee ee : employeeArray)
		{
			System.out.println("id = " + ee.getId() + ", " + "salary = " + ee.getSalary());
		}
	}
}

class Employee implements Comparable<Employee>
{
	private String id;
	private int salary;
	public Employee(String id, int salary)
	{
		this.id = id;
		this.salary = salary;
	}
	public String getId()
	{
		return this.id;
	}
	public int getSalary()
	{
		return this.salary;
	}
	@Override
	public int compareTo(Employee other)
	{
		if(salary < other.salary)
			return -1;
		if(salary > other.salary)
			return 1;
		return 0;
	}
}</span>
运行效果如下:

      二、然后是定制规则的排序,首先定义一个规则类,该规则类需实现Comparator接口,与上一种方式中对象所属的类要实现Comparable接口不同,比如这里将要按姓名排序,下面的例子中定义了两套规则,分别依据firstName和lastName按照字典顺序进行排序,代码如下:

<span style="font-size:14px;">import java.util.Comparator;
import java.util.Arrays;
public class PersonTest
{
	public static void main(String[] args)
	{
		Person[] persons = new Person[4];
		persons[0] = new Person("Shaomin", "Hu", 36);
		persons[1] = new Person("Lesheng", "Gu", 56);
		persons[2] = new Person("Xiaorong", "Gu", 28);
		persons[3] = new Person("Cook", "John", 45);

		System.out.println("Natural order:");
		for(Person p : persons)
		{
			System.out.println("Full name: " + p.getFirstName() + " " + p.getLastName() + ", Age: " + p.getAge());
		}

		Arrays.sort(persons, new FirstNameComparator());
		System.out.println("Sorted by firstName:");
		for(Person p : persons)
		{
			System.out.println("Full name: " + p.getFirstName() + " " + p.getLastName() + ", Age" + p.getAge());
		}

		Arrays.sort(persons, new LastNameComparator());
		System.out.println("Sorted by lastName:");
		for(Person p : persons)
		{
			System.out.println("Full name: " + p.getFirstName() + " " + p.getLastName() + ", Age" + p.getAge());
		}
	}
}

class Person
{
	private String firstName;
	private String lastName;
	private int age;

	public Person(String firstName, String lastName, int age)
	{
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}
	public String getFirstName()
	{
		return this.firstName;
	}
	public String getLastName()
	{
		return this.lastName;
	}
	public int getAge()
	{
		return this.age;
	}
}

class FirstNameComparator implements Comparator<Person>
{
	@Override
	public int compare(Person o1, Person o2)
	{
		String lastName1 = o1.getLastName().toString();
		String firstName1 = o1.getFirstName().toString();
		String lastName2 = o2.getLastName().toString();
		String firstName2 = o2.getFirstName().toString();

		if(firstName1.equals(firstName2))
		{
			return lastName1.compareTo(lastName2);
		}
		else
		{
			return firstName1.compareTo(firstName2);
		}
	}
}

class LastNameComparator implements Comparator<Person>
{
	@Override
	public int compare(Person o1, Person o2)
	{
		String lastName1 = o1.getLastName().toString();
		String firstName1 = o1.getFirstName().toString();
		String lastName2 = o2.getLastName().toString();
		String firstName2 = o2.getFirstName().toString();

		if(lastName1.equals(lastName2))
		{
			return firstName1.compareTo(firstName2);
		}
		else
		{
			return lastName1.compareTo(lastName2);
		}
	}
}</span>
运行效果如下:

本博文内容参考自北京理工大学金旭亮老师的教育网站上的教学课件,金老师一直致力于培养学生实打实的软件开发技能,感谢金老师任劳任怨的付出,详细了解金老师的请移步至金老师教育网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值