Java 集合:Collections 排序

你可以借助 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 对对象进行排序

有时候,你可能需要按与列表自然顺序不同的另一种顺序排序,甚至你要排序的对象可能完全没有自然顺序。这种情况下,可改用 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 接口

   

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号