<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 如何在 Java 中對數組,列表,映射和集合進行排序 > 原文: [https://howtodoinjava.com/java-sorting-guide/](https://howtodoinjava.com/java-sorting-guide/) 學習使用 Java 對數組或集合進行排序。 我們將學習對包含原始類型和自定義對象的集合,列表和映射進行排序。 我們還將學習升序排序。 ## 1\. 排序數組 #### 1.1 升序排序數組 Java 程序使用[`Arrays.sort()`](https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(byte[]))方法以升序對整數數組進行排序。 ```java import java.util.Arrays; public class JavaSortExample { public static void main(String[] args) { //Unsorted array Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 520, 1123, 366, 420 }; //Sort the array Arrays.sort(numbers); //Print array to confirm System.out.println(Arrays.toString(numbers)); } } ``` 程序輸出。 ```java [9, 11, 15, 18, 47, 55, 366, 420, 520, 1123] ``` #### 1.2 降序排序數組 Java 提供`Collections.reverseOrder()`比較器,以在一行中反轉默認的排序行為。 使用此命令以降序對數組進行排序。 ```java //Unsorted array Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 520, 1123, 366, 420 }; //Sort the array in reverse order Arrays.sort(numbers, Collections.reverseOrder()); //Print array to confirm System.out.println(Arrays.toString(numbers)); ``` 程序輸出: ```java [1123, 520, 420, 366, 55, 47, 18, 15, 11, 9] ``` #### 1.3 排序數組范圍 `Arrays.sort()`方法是重載方法,它采用兩個附加參數,即`fromIndex`(包括)和`toIndex`(排除)。 提供時,數組將在從位置`fromIndex`到位置`toIndex`的指定范圍內排序。 給定示例對元素 9 到 18 之間的數組進行排序,即{9,55,47,18}將被排序,其余元素將不會被觸摸。 ```java //Unsorted array Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 1123, 520, 366, 420 }; //Sort the array Arrays.sort(numbers, 2, 6); //Print array to confirm System.out.println(Arrays.toString(numbers)); ``` 程序輸出: ```java [15, 11, 9, 18, 47, 55, 1123, 520, 366, 420] ``` #### 1.4 Java 8 并行排序 Java 8 引入了許多用于并行處理數據集和流的新 API。 一種此類 API 是`Arrays.parallelSort()`。 它將數組分為不同的子數組,并且每個子數組在**不同線程**中以`Arrays.sort()`進行排序。 最終,所有排序的子數組將合并為一個數組。 兩個 API 的`parallelSort()`和`sort()`的輸出最終將相同。 這只是利用多線程的問題。 ```java Arrays.parallelSort(numbers); Arrays.parallelSort(numbers, 2, 6); Arrays.parallelSort(numbers, Collections.reverseOrder()); ``` ## 2\. 排序列表 可以使用[`Collections.sort()`](https://docs.oracle.com/javase/7/docs/api/java/util/List.html) API 在 Java 中對列表進行排序。 它使用修改后的**歸并排序**,并提供有保證的`nlog(n)`性能。 #### 2.1 升序排序列表 ```java //Unsorted list Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 1123, 520, 366, 420 }; List<Integer> numbersList = Arrays.asList(numbers); //Sort the list Collections.sort(numbersList); //Print list to confirm System.out.println(numbersList); ``` 程序輸出: ```java [9, 11, 15, 18, 47, 55, 366, 420, 520, 1123] ``` #### 2.2 降序排序列表 與數組類似,使用`Collections.reverseOrder()`可以反轉默認的排序行為。 ```java //Unsorted list Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 1123, 520, 366, 420 }; List<Integer> numbersList = Arrays.asList(numbers); //Sort the list Collections.sort(numbersList, Collections.reverseOrder()); //Print list to confirm System.out.println(numbersList); ``` 程序輸出: ```java [1123, 520, 420, 366, 55, 47, 18, 15, 11, 9] ``` ## 3\. 排序集合 不直接支持對 Java 中的集合進行排序。 要對集合進行排序,請按照下列步驟操作: 1. 將集轉換為列表。 2. 使用`Collections.sort()` API 排序列表。 3. 將列表轉換回集合。 ```java //Unsorted list HashSet<Integer> numbersSet = new LinkedHashSet<>( Arrays.asList(15, 11, 9, 55, 47, 18, 1123, 520, 366, 420) ); List<Integer> numbersList = new ArrayList<Integer>(numbersSet) ; //set -> list //Sort the list Collections.sort(numbersList); numbersSet = new LinkedHashSet<>(numbersList); //list -> set //Print set to confirm System.out.println(numbersSet); ``` 程序輸出: ```java [9, 11, 15, 18, 47, 55, 366, 420, 520, 1123] ``` ## 4\. 排序映射 映射是鍵值對的集合。 因此,映射可以通過兩種方式進行排序,即**按鍵**排序或**按值**排序。 #### 4.1 按鍵排序映射 按鍵對映射進行排序的最好,最有效的方法是在`TreeMap`對象中添加所有映射項。 `TreeMap`按鍵對條目集進行排序。 ```java HashMap<Integer, String> map = new HashMap<>(); map.put(50, "Alex"); map.put(20, "Charles"); map.put(60, "Brian"); map.put(70, "Edwin"); map.put(120, "George"); map.put(10, "David"); TreeMap<Integer, String> treeMap = new TreeMap<>(map); System.out.println(treeMap); ``` 程序輸出: ```java {10=David, 20=Charles, 50=Alex, 60=Brian, 70=Edwin, 120=George} ``` #### 4.2 按值排序映射 在 Java 8 中,`Map.Entry`類具有靜態方法`compareByValue()`,可幫助您按值排序。 此方法返回一個**比較器**,該比較器以自然順序比較值上的`Map.Entry`。 ```java HashMap<Integer, String> unSortedMap = new HashMap<>(); unSortedMap.put(50, "Alex"); unSortedMap.put(20, "Charles"); unSortedMap.put(60, "Brian"); unSortedMap.put(70, "Edwin"); unSortedMap.put(120, "George"); unSortedMap.put(10, "David"); //LinkedHashMap preserve the ordering of elements in which they are inserted LinkedHashMap<Integer, String> sortedMap = new LinkedHashMap<>(); unSortedMap.entrySet() .stream() .sorted(Map.Entry.comparingByValue()) .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue())); System.out.println(sortedMap); ``` 程序輸出: ```java {50=Alex, 60=Brian, 20=Charles, 10=David, 70=Edwin, 120=George} ``` ## 5\. 對自定義對象進行排序 自定義對象是**用戶定義的類**,它們保存域數據,例如 `Employee`,`Department`,`Account`等。 為了對自定義對象列表進行排序,我們有兩種流行的方法,即`Comparable`和`Comparator`。 在給定的示例中,我們將對`Employee`類的實例的集合進行排序。 ```java import java.time.LocalDate; public class Employee implements Comparable<Employee> { private Long id; private String name; private LocalDate dob; public Employee(Long id, String name, LocalDate dob) { super(); this.id = id; this.name = name; this.dob = dob; } @Override public int compareTo(Employee o) { return this.getId().compareTo(o.getId()); } //Getters and Setters @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]"; } } ``` #### 5.1 `Comparable` [`Comparable`](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)接口啟用其實現的類的**自然排序**。 它使類與其實例具有可比性。 實現`Comparable`接口的類必須覆蓋`compareTo()`方法,在該方法中,它可以指定同一類的兩個實例之間的比較邏輯。 可以通過`Collections.sort()`和`Arrays.sort()`自動對實現此接口的對象的列表(和數組)進行排序。 當將實現此接口的對象放入已排序的映射(作為鍵)或已排序的集合(作為元素)時,將自動對其進行排序。 強烈建議(盡管不是必需的)自然順序應與`equals`一致。 實際上,所有實現`Comparable`的 Java 核心類都具有與`equals`一致的自然順序。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(1l, "Alex", LocalDate.of(2018, Month.APRIL, 21))); list.add(new Employee(4l, "Brian", LocalDate.of(2018, Month.APRIL, 22))); list.add(new Employee(3l, "Piyush", LocalDate.of(2018, Month.APRIL, 25))); list.add(new Employee(5l, "Charles", LocalDate.of(2018, Month.APRIL, 23))); list.add(new Employee(2l, "Pawan", LocalDate.of(2018, Month.APRIL, 24))); Collections.sort(list); System.out.println(list); ``` 程序輸出: ```java [Employee [id=1, name=Alex, dob=2018-04-21], ] Employee [id=2, name=Pawan, dob=2018-04-24], Employee [id=3, name=Piyush, dob=2018-04-25], Employee [id=4, name=Brian, dob=2018-04-22], Employee [id=5, name=Charles, dob=2018-04-23]] ``` #### 5.2 `Comparator` 很多時候,我們會遇到這樣的情況,即由于遺留代碼問題,我們不會尋求自然排序或類文件而無法進行編輯。 在這種情況下,我們可以利用[比較器](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)接口。 比較器不需要修改該類的源代碼。 我們可以在單獨的類中創建比較邏輯,以實現`Comparator`接口并覆蓋其`compare()`方法。 然后將此比較器以及自定義對象列表傳遞給`sort()`方法。 例如,在比較器下面,按員工列表的**名稱**對其排序。 ```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() ); } } ``` Java 程序使用`Comparator`接口實現對列表進行排序。 注意在`sort()`方法中使用`NameSorter`作為第二個參數。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(1l, "Alex", LocalDate.of(2018, Month.APRIL, 21))); list.add(new Employee(4l, "Brian", LocalDate.of(2018, Month.APRIL, 22))); list.add(new Employee(3l, "Piyush", LocalDate.of(2018, Month.APRIL, 25))); list.add(new Employee(5l, "Charles", LocalDate.of(2018, Month.APRIL, 23))); list.add(new Employee(2l, "Pawan", LocalDate.of(2018, Month.APRIL, 24))); Collections.sort(list, new NameSorter()); System.out.println(list); ``` 程序輸出: ```java [Employee [id=1, name=Alex, dob=2018-04-21], Employee [id=4, name=Brian, dob=2018-04-22], Employee [id=5, name=Charles, dob=2018-04-23], Employee [id=2, name=Pawan, dob=2018-04-24], Employee [id=3, name=Piyush, dob=2018-04-25]] ``` #### 5.3 用 Java 8 Lambda 排序 Java 8 Lambda 表達式有助于即時編寫`Comparator`實現。 我們不需要創建單獨的類來提供一次性比較邏輯。 ```java Comparator<Employee> nameSorter = (a, b) -> a.getName().compareToIgnoreCase(b.getName()); Collections.sort(list, nameSorter); ``` #### 5.4 分組排序 要使用**鏈中的多個比較器**對不同字段上的對象集合進行分組排序。 可以使用`Comparator.comparing()`和`Comparator.thenComparing()`方法創建比較器的鏈接。 例如,我們按姓名對員工列表進行排序,然后再按其年齡進行排序。 ```java ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee(1l, "Alex", LocalDate.of(2018, Month.APRIL, 21))); list.add(new Employee(4l, "Brian", LocalDate.of(2018, Month.APRIL, 01))); list.add(new Employee(3l, "Alex", LocalDate.of(2018, Month.APRIL, 25))); list.add(new Employee(5l, "Charles", LocalDate.of(2018, Month.APRIL, 23))); list.add(new Employee(2l, "Alex", LocalDate.of(2018, Month.APRIL, 30))); Collections.sort(list, Comparator .comparing(Employee::getName) .thenComparing(Employee::getDob)); System.out.println(list); ``` 程序輸出: ```java [Employee [id=1, name=Alex, dob=2018-04-21], Employee [id=3, name=Alex, dob=2018-04-25], Employee [id=2, name=Alex, dob=2018-04-30], Employee [id=4, name=Brian, dob=2018-04-01], Employee [id=5, name=Charles, dob=2018-04-23]] ``` ## 6\. 總結 在上面給出的示例中,我們學習了對數組,列表,映射和集合進行排序。 我們看到了用于初始化和使用`Comparator`接口(包括 lambda 表達式)的不同方法。 歡迎分享您對 **Java** 排序的看法。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看