Java集合-排序
我们可以使用java.util.Collections.sort()方法对List集合进行排序。我们可以对"列表"的两种类型进行排序。
- 列表(List)
- 链表(LinkedList)
按对象的自然顺序排序
要对List
进行排序,请执行以下操作:
List list = new ArrayList(); //add elements to the list Collections.sort(list);
当对这样的列表进行排序时,元素将根据其"自然顺序"进行排序。为了使对象具有自然顺序,它们必须实现接口java.lang.Comparable。换句话说,这些对象必须具有可比性以确定它们的顺序。这是"可比较"界面的外观:
public interface Comparable<T> { int compareTo(T o); }
compareTo()方法应将此对象与另一个对象进行比较,并返回一个int值。以下是该int
值的规则:
- 如果此对象小于另一个对象,则返回负值
- 如果此对象等于另一个对象,则返回0(零)。
- 如果此对象大于另一个对象,则返回一个正值。
在实现过程中还需要遵守一些更具体的规则,但是以上是主要要求。查看JavaDoc了解详细信息。
假设我们正在对String元素的List进行排序。为了对它们进行排序,根据某种排序算法将每个字符串与其他字符串进行比较(此处没有意义)。每个字符串通过字母比较将自己与另一个字符串进行比较。因此,如果一个字符串通过字母比较小于另一个字符串,它将从compareTo()方法返回一个负数。
当我们在自己的类中实现compareTo()
方法时,必须决定如何将这些对象相互比较。例如,可以通过名字,姓氏,薪水,开始年份或者我们认为有意义的任何事物来比较"雇员"对象。
使用比较器对对象进行排序
有时,我们可能想根据自然顺序以外的其他顺序对列表进行排序。也许我们正在排序的对象甚至没有自然顺序。在这种情况下,我们可以改用"比较器"。这是使用"比较器"对列表进行排序的方式:
List list = new ArrayList(); //add elements to the list Comparator comparator = new SomeComparator(); Collections.sort(list, comparator);
注意,除了List
之外,Collections.sort()
方法现在如何以java.util.Comparator
作为参数。这个"比较器"将列表中的元素二乘二地进行比较。这是"比较器"界面的外观:
public interface Comparator<T> { int compare(T object1, T object2); }
compare()方法将两个对象相互比较,并且应该:
- 如果object1小于object2,则返回负值
- 如果objec1等于object2,则返回0(零)。
- 如果object1大于object2,则返回正值。
实现compare()方法还有一些其他要求,但这是主要要求。请查看JavaDoc了解更多详细信息。
这是一个比较器示例,它比较两个虚拟的Employee对象:
public class MyComparator<Employee> implements Comparator<Employee> { public int compare(Employee emp1, Employee emp2){ if(emp1.getSalary() < emp2.getSalary()) return -1; if(emp1.getSalary() == emp2.getSalary()) return 0; return 1; } }
编写比较的较短方法是这样的:
public class MyComparator<Employee> implements Comparator<Employee> { public int compare(Employee emp1, Employee emp2){ return emp1.getSalary() - emp2.getSalary(); } }
通过从另一个工资中减去一个工资,得出的值将自动为负,0或者正。聪明吧?
如果我们要通过多个因素比较对象,请先通过第一个因素(例如名字)进行比较。然后,如果第一个因素相等,请与第二个因素进行比较(例如姓氏或者薪水)等。