Java 中的排序比較器

Rashmi Patidar 2023年10月12日
  1. 在 Java 中使用 DepartmentComparator 對元素進行排序
  2. 使用 Java 8 中的 lambda 函式修改上面的程式
Java 中的排序比較器

本文定義了 Java 中的排序比較器是什麼,並演示瞭如何在程序中使用它。我們已經包含了你可以遵循的程式來幫助你更好地理解這個概念。

在 Java 中使用 DepartmentComparator 對元素進行排序

Sorting 是按照確定的順序排列資料結構(如 list 陣列)的過程。該過程通過比較資料元素來工作,從而定義新位置。Java 中定義了各種型別的排序演算法,這些演算法基於結構的複雜性是有用的。

下面是定義覆蓋比較器介面的程式碼塊,以提供我們對元素進行排序的實現。

import java.util.*;

public class DepartmentComparator {
  public static void main(String[] args) {
    List<Department> departments = Arrays.asList(new Department("dept1", 2001),
        new Department("dept2", 1998), new Department("dept3", 2021));
    Collections.sort(departments, new LexicographicComparator());
    System.out.println("Sorting on the basis of name: " + departments);
    Collections.sort(departments, new YearComparator());
    System.out.println("Sorting on the basis of year: " + departments);
  }

  static class LexicographicComparator implements Comparator<Department> {
    @Override
    public int compare(Department a, Department b) {
      return a.name.compareToIgnoreCase(b.name);
    }
  }

  static class YearComparator implements Comparator<Department> {
    @Override
    public int compare(Department a, Department b) {
      return a.establish_year < b.establish_year ? -1
          : a.establish_year == b.establish_year ? 0
                                                 : 1;
    }
  }

  static class Department {
    String name;
    int establish_year;

    Department(String n, int a) {
      name = n;
      establish_year = a;
    }

    @Override
    public String toString() {
      return String.format("{name=%s, Establish Year=%d}", name, establish_year);
    }
  }
}

在上面的程式中,DepartmentComparator 類是一個公共類,它包含 main 方法並充當驅動程式程式碼。除了主類之外,程式碼還新增了非公共類以顯示功能。Department 類是一個 POJO,它包含一個欄位名稱和 establish_year 變數並覆蓋了 toString() 函式。除了 bean 類,LexicographicComparator 類和 YearComparator 類實現了 Comparator 介面。

在靜態方法中,一個 List 被初始化為三個元素。Array.asList 是一個靜態方法,它返回一個固定大小的 List。該函式將類的例項轉換為列表。因此 department class 例項是使用 new 關鍵字建立的,現在稱為 引數化 建構函式。此建構函式初始化名稱並根據傳遞的引數建立年份。

建立列表後,將呼叫 Collections 類的 sort 方法。它根據給定的比較器對定義的列表或集合進行排序。該方法採用手動比較器並返回 void 但修改作為引數傳遞的集合。當元素屬於不同型別時,該方法會丟擲 ClassCastException。該方法將列表集合作為第一個引數,將手動比較器作為第二個引數。

LexicographicComparatorYearComparator 類被建立用於手動比較。這些類使用單個方法 compare 實現了一個功能介面,即 Comparator,該方法根據比較返回一個 int 值。該方法在使用者定義的類中被覆蓋,在該類中可以定義使用者指定的實現。

LexicographicComparator 類中,該方法根據名稱指定條件,比較傳遞的引數,並根據輸入是小於、大於還是等於返回 -101 對彼此。類似地,覆蓋 YearComparator 方法以比較作為引數傳遞的年份。

以下是按名稱、升序和年份排列的輸出。

Sorting on the basis of name: [{name=dept1, Establish Year=2001}, {name=dept2, Establish Year=1998}, {name=dept3, Establish Year=2021}]
Sorting on the basis of year: [{name=dept2, Establish Year=1998}, {name=dept1, Establish Year=2001}, {name=dept3, Establish Year=2021}]

使用 Java 8 中的 lambda 函式修改上面的程式

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class DepartmentCompareUsingJava8 {
  public static void main(String[] args) {
    List<DepartmentComparator.Department> departments =
        Arrays.asList(new DepartmentComparator.Department("dept1", 2001),
            new DepartmentComparator.Department("dept2", 1998),
            new DepartmentComparator.Department("dept3", 2021));
    Collections.sort(departments, (a, b) -> a.name.compareToIgnoreCase(b.name));
    System.out.println(departments);
    Collections.sort(departments,
        (a, b)
            -> a.establish_year < b.establish_year ? -1
            : a.establish_year == b.establish_year ? 0
                                                   : 1);
    System.out.println(departments);
  }
}

該程式的不同之處在於,Java 8 函式式介面不是定義實現 Comparator 介面的新類,而是有助於減少每次處理新類的開銷。Functional Interface 有一個未實現的方法或 abstract 方法。它減少了建立實現介面並提供自己的方法版本的類的開銷。

它使用 lambda ()-> 函式直接呼叫該方法。Lambda 將函式視為引數,並且不需要任何用於例項化的類。該函式接受引數並在同一行中給出實現,而不是在單獨的類中。

上面程式的輸出與第一個程式碼中的輸出相同。

作者: Rashmi Patidar
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相關文章 - Java Comparator

相關文章 - Java Sort