你可以借助 java.util.Collections.sort () 方法对 List 集合进行排序,该方法适用于这两种类型的 List。
要对一个列表进行排序,你可以这样做:
List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); System.out.println(list); //[one, two, three] Collections.sort(list); System.out.println(list); //[one, three, two]
以这种方式对列表排序时,元素会按其 “自然顺序” 排序。
注意,对象要具备自然顺序,必须实现 java.lang.Comparable 接口。也就是说,对象必须是可比较的,才能确定它们的排列顺序。
以下是 Comparable 接口的结构:
public interface Comparable<T> { int compareTo(T o); }
其中,compareTo() 方法将当前对象与另一个对象进行比较,并返回一个 int 值。以下是该 int 值的规则:
如果当前对象小于另一个对象,则返回一个负值
如果此对象与另一个对象相等,则返回 0(零)
如果此对象大于另一个对象,则返回一个正值
若你正在对字符串元素列表排序,排序时每个字符串会借助某种排序算法(具体算法暂不讨论)与其他字符串比对。字符串间通过字母顺序开展比较,当一个字符串按字母顺序小于另一个时,compareTo () 方法将返回负数。
注意,在自定义类中实现 compareTo () 方法时,你需要确定对象之间的比较方式。例如,Employee 对象可依据姓名、姓氏、薪水、入职年份,或其他任何你认为合理的维度进行比较。
详细信息参考 Java 集合:Comparable 接口。
有时候,你可能需要按与列表自然顺序不同的另一种顺序排序,甚至你要排序的对象可能完全没有自然顺序。这种情况下,可改用 Comparator。例如:
List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); System.out.println(list); //[one, two, three] Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); System.out.println(list); //[two, three, one]
注意,现在的 Collections.sort () 方法,除了列表之外,还能接收 java.util.Comparator 作为参数,此 Comparator 会将列表中的元素逐一两两比对。
以下是 Comparator 接口的match样子:
public interface Comparator<T> { int compare(T object1, T object2); }
compare() 方法会将两个对象相互比较,它应该:
如果 object1 小于 object2,则返回一个负值
如果 object1 等于 object2,则返回0(零)
如果 object1 大于 object2,则返回一个正值
compare() 方法的实现还有一些其他要求,但这些是主要要求。以下是一个比较两个虚构的 Employee 对象的 Comparator 示例:
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(); } }
通过用一个薪水减去另一个薪水(salary),得到的结果自然不是负数、0 就是正数。很巧妙,对吧?
如果你想通过多个因素来比较对象,首先按第一个因素进行比较(例如名字)。然后,如果第一个因素相同,再按第二个因素进行比较(例如姓氏或薪水),以此类推。
详细信息参考 Java 集合:Comparator 接口。