Java集合-排序

时间:2020-01-09 10:35:49  来源:igfitidea点击:

我们可以使用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或者正。聪明吧?

如果我们要通过多个因素比较对象,请先通过第一个因素(例如名字)进行比较。然后,如果第一个因素相等,请与第二个因素进行比较(例如姓氏或者薪水)等。