<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java `Comparator`接口示例 > 原文: [https://howtodoinjava.com/java/collections/java-comparator/](https://howtodoinjava.com/java/collections/java-comparator/) **Java 比較器**接口,用于根據**自定義順序**對對象的[數組](https://howtodoinjava.com/java-array/)或[列表](https://howtodoinjava.com/java-arraylist/)進行排序。 通過在對象中實現`Comparator.compare()`方法來強加元素的自定義順序。 ## 1\. Java `Comparator`接口 Java `Comparator`接口在可能沒有自然順序的對象上強加了**自定義順序**。 例如,對于`Elpmoyees`對象的列表,自然順序可以是按員工 ID 排序的順序。 但是在現實生活中,我們可能希望按照員工的名字,出生日期或其他任何類似標準對員工列表進行排序。 在這種情況下,我們需要使用`Comparator`接口。 在以下情況下,我們可以使用`Comparator`接口。 1. 對對象的數組或列表進行排序,但不按自然順序排序。 2. 在無法修改對象源代碼以實現[`Comparable`](https://howtodoinjava.com/java/collections/java-comparable-interface/)接口的情況下,對對象的數組或列表進行排序。 3. 在不同字段上對相同對象列表或對象數組進行排序。 4. 在不同字段上對對象列表或數組進行分組排序。 #### 1.1\. `Comparator.compare()` 為了對對象啟用總體排序,我們需要創建實現`Comparator`接口的類。 然后,我們需要覆蓋它的`compare(T o1, T o2)`方法。 它比較兩個參數的順序。 當第一個參數小于,等于或大于第二個參數時,它將返回負整數,零或正整數。 實現者還必須確保該關系是**可傳遞的**:`compare(x, y)>0 && compare(y, z)>0`隱含`compare(x, z)>0`。 ```java import java.time.LocalDate; public class Employee implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String name; private LocalDate dob; //Getters and Setters @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]"; } } ``` 對于以上類別,可以通過創建如下的`Comparator`來強行按員工姓名排序。 ```java import java.util.Comparator; public class NameSorter implements Comparator<Employee> { @Override public int compare(Employee e1, Employee e2) { return e1.getName().compareToIgnoreCase( e2.getName() ); } } ``` #### 1.2 `Collections.sort()`和`Arrays.sort()` 1. 使用`Collections.sort(list, Comparator)`方法按提供的比較器實例施加的順序對對象的**列表**進行排序。 2. 使用`Arrays.sort(array, Comparator)`方法按提供的比較器實例施加的順序對對象的**數組**進行排序。 #### 1.3 `Collections.comparing()` 該工具方法接受一個為類提取排序鍵的函數。 本質上,這是一個將對類對象進行排序的字段。 ```java //Order by name Comparator.comparing(Employee::getName); //Order by name in reverse order Comparator.comparing(Employee::getName).reversed(); //Order by id field Comparator.comparing(Employee::getId); //Order by employee age Comparator.comparing(Employee::getDate); ``` #### 1.4 `Collections.thenComparing()` 該工具方法按類別分組。 使用此方法,我們可以鏈接多個比較器以對多個字段上的對象列表或對象數組進行排序。 它與`SQL GROUP BY`子句非常相似,可以對不同字段上的行進行排序。 ```java //Order by name and then by age Comparator.comparing(Employee::getName) .thenComparing(Employee::getDob); //Order by name -> date of birth -> id Comparator.comparing(Employee::getName) .thenComparing(Employee::getDob) .thenComparing(Employee::getId); ``` 使用以上語法,我們幾乎可以創建任何排序邏輯。 #### 1.5 `Collections.reverseOrder()` 此工具方法返回一個比較器,該比較器在實現`Comparable`接口的對象集合上強加*自然排序*或*自定義排序*的逆向。 ```java //Reverse of natural order as specified in //Comparable interface's compareTo() method Comparator.reversed(); //Reverse of order by name Comparator.comparing(Employee::getName).reversed(); ``` ## 2\. Java `Comparator`示例 #### 2.1 排序對象列表 Java 示例**使用比較器按名稱**對員工列表進行排序。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(22l, "Lokesh", LocalDate.now())); list.add(new Employee(30l, "Bob", LocalDate.now())); list.add(new Employee(18l, "Alex", LocalDate.now())); list.add(new Employee(5l, "David", LocalDate.now())); list.add(new Employee(600l, "Charles", LocalDate.now())); //Sort in reverse natural order Collections.sort(list, new NameSorter()); System.out.println(list); ``` 程序輸出。 ```java [ Employee [id=18, name=Alex, dob=2018-10-30], Employee [id=30, name=Bob, dob=2018-10-30], Employee [id=600, name=Charles, dob=2018-10-30], Employee [id=5, name=David, dob=2018-10-30], Employee [id=22, name=Lokesh, dob=2018-10-30] ] ``` #### 2.2 以相反的順序對對象列表進行排序 Java 示例**使用**反向順序**使用比較器按名稱**對員工列表進行排序。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(22l, "Lokesh", LocalDate.now())); list.add(new Employee(30l, "Bob", LocalDate.now())); list.add(new Employee(18l, "Alex", LocalDate.now())); list.add(new Employee(5l, "David", LocalDate.now())); list.add(new Employee(600l, "Charles", LocalDate.now())); Collections.sort(list, Comparator.comparing( Employee::getName ).reversed()); System.out.println(list); ``` 程序輸出: ```java [ Employee [id=22, name=Lokesh, dob=2018-10-30], Employee [id=5, name=David, dob=2018-10-30], Employee [id=600, name=Charles, dob=2018-10-30], Employee [id=30, name=Bob, dob=2018-10-30], Employee [id=18, name=Alex, dob=2018-10-30] ] ``` #### 2.3 通過按照多個字段對對象列表進行分組排序 Java 示例,用于按多個字段對多個字段(即**字段**)上的雇員列表進行排序。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(22l, "Lokesh", LocalDate.now())); list.add(new Employee(30l, "Lokesh", LocalDate.now())); list.add(new Employee(18l, "Alex", LocalDate.now())); list.add(new Employee(5l, "Lokesh", LocalDate.now())); list.add(new Employee(600l, "Charles", LocalDate.now())); Comparator<Employee> groupByComparator = Comparator.comparing(Employee::getName) .thenComparing(Employee::getDob) .thenComparing(Employee::getId); Collections.sort(list, groupByComparator); System.out.println(list); ``` 程序輸出: ```java [ Employee [id=18, name=Alex, dob=2018-10-30], Employee [id=600, name=Charles, dob=2018-10-30], Employee [id=5, name=Lokesh, dob=2018-10-30], Employee [id=22, name=Lokesh, dob=2018-10-30], Employee [id=30, name=Lokesh, dob=2018-10-30]] ``` ## 3\. 總結 在本教程中,我們學習了 Java 集合框架的`Comparator`接口。 它有助于在不更改該類源代碼的情況下,對對象施加總體順序。 我們學會了對對象的列表和數組進行排序。 我們學習了如何使用`Comparator`接口在 Java 中對員工對象進行排序,即 **Java 比較器的多個字段示例**。 將我的問題放在評論部分。 學習愉快! 參考文獻: [`Comparator`接口 Java 文檔](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparator.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看