天天看點

看完這篇文章,Java集合排序難題輕松解決!

作者:你的老師父

在Java程式設計中,集合是非常常見的資料結構之一。而對于集合中的元素進行排序也是開發過程中常見的需求。本文将詳細介紹Java集合的排序方法,包括使用Java自帶排序算法以及自定義比較器等内容。并且會提供實際的代碼案例幫助讀者更好地了解和應用排序方法。

Java自帶排序算法

Java中的集合架構提供了一些預設的排序算法,例如Collections.sort()方法和Arrays.sort()方法。這些排序算法非常友善,不需要手動實作排序算法,并且可以對各種類型的Java集合進行排序,包括數組。在這裡我們将分别介紹這兩種方法的使用。

Collections.sort()

Collections.sort()方法用于對List集合進行排序。該方法接受一個List對象作為參數,并使用預設的自然順序對其進行排序。自然順序是基于元素的特定屬性值進行排序,例如整數值或字元串值。

下面是一個示例程式,展示了如何對一個List對象進行排序:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SortExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("orange");
        
        System.out.println("Before sorting: " + list);
        
        Collections.sort(list);
        
        System.out.println("After sorting: " + list);
    }
}
           

上述代碼将建立一個List對象,并向其中添加三個字元串類型的元素。然後通過Collections.sort()方法對其進行排序,之後輸出排序前和排序後的結果。

該示例程式的輸出如下:

Before sorting: [apple, banana, orange]
After sorting: [apple, banana, orange]
           

從輸出結果可以看出,List對象是按照字母順序排列的。

如果要對其他類型的集合進行排序,隻需将其轉換為List集合即可。例如,對于數組,可以使用Arrays.asList()方法将其轉換為List對象:

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

public class SortExample {
    public static void main(String[] args) {
        String[] array = {"apple", "banana", "orange"};
        List<String> list = Arrays.asList(array);
        
        System.out.println("Before sorting: " + list);
        
        Collections.sort(list);
        
        System.out.println("After sorting: " + list);
    }
}
           

上述代碼将建立一個String類型的數組,并将其轉換為List對象。然後,我們使用與第一個示例相同的代碼對其進行排序。最後,将排序前和排序後的結果輸出到控制台。

該示例程式的輸出如下:

Before sorting: [apple, banana, orange]
After sorting: [apple, banana, orange]
           

從輸出結果可以看出,将數組轉換為List對象後,Collections.sort()方法同樣可以對其進行排序。

Arrays.sort()

Arrays.sort()方法用于對數組進行排序。該方法接受一個數組作為參數,并使用預設的自然順序對其進行排序。

下面是一個示例程式,展示了如何對一個整數類型的數組進行排序:

import java.util.Arrays;

public class SortExample {
    public static void main(String[] args) {
        int[] array = {3, 2, 1};
        
        System.out.println("Before sorting: " + Arrays.toString(array));
        
        Arrays.sort(array);
        
        System.out.println("After sorting: " + Arrays.toString(array));
    }
}
           

上述代碼将建立一個長度為3的int類型數組,并将其初始化為{3, 2, 1}。然後,我們使用Arrays.sort()方法對其進行排序。最後,将排序前和排序後的結果輸出到控制台該示例程式的輸出如下:

Before sorting: [3, 2, 1]
After sorting: [1, 2, 3]
           

從輸出結果可以看出,數組已按升序排列。

與Collections.sort()方法一樣,如果要對其他類型的數組進行排序,隻需将其轉換為相應類型的引用類型數組即可。例如,對于double類型的數組,可以使用Double[]數組代替double[]數組,并使用Arrays.asList()方法将其轉換為List對象。然後,我們使用Collections.sort()方法對其進行排序。

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

public class SortExample {
    public static void main(String[] args) {
        double[] array = {3.0, 2.0, 1.0};
        List<Double> list = Arrays.asList(Arrays.stream(array).boxed().toArray(Double[]::new));
        
        System.out.println("Before sorting: " + list);
        
        Collections.sort(list);
        
        System.out.println("After sorting: " + list);
    }
}
           

上述代碼将建立一個長度為3的double類型數組,并将其初始化為{3.0, 2.0, 1.0}。然後,我們使用Double[]數組代替double[]數組,并使用Arrays.asList()方法将其轉換為List對象。最後,我們使用Collections.sort()方法對其進行排序。最終,将排序前和排序後的結果輸出到控制台。

該示例程式的輸出如下:

Before sorting: [3.0, 2.0, 1.0]
After sorting: [1.0, 2.0, 3.0]
           

從輸出結果可以看出,我們成功地将double類型的數組轉換為List對象,并對其進行了排序。

自定義比較器

如果要按照除預設排序順序以外的方式對集合進行排序,則需要使用自定義比較器。Java中的Comparator接口提供了實作自定義比較器的方法。該接口包含一個compare()方法,可用于比較兩個對象的大小關系。在這裡,我們将介紹如何使用Comparator接口來實作自定義排序算法。

使用Comparator排序

下面是一個示例程式,展示了如何使用Comparator接口來對集合進行自定義排序:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("orange");
        
        System.out.println("Before sorting: " + list);
        
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        };
        
        Collections.sort(list, comparator);
        
        System.out.println("After sorting: " + list);
    }
}
           

上述代碼将建立一個List對象,并向其中添加三個字元串類型的元素。然後,我們建立一個Comparator對象來實作自定義排序算法,并使用Collections.sort()方法對其進行排序。最後,将排序前和排序後的結果輸出到控制台。

該示例程式的輸出如下:

Before sorting: [apple, banana, orange]
After sorting: [apple, orange, banana]
           

從輸出結果可以看出,我們成功地按字元串長度對List對象進行了排序。

lambda表達式實作Comparator

在Java 8之後,使用lambda表達式替代匿名内部類來建立Comparator對象非常友善。下面是一個示例程式,展示了如何使用lambda表達式來建立Comparator對象:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("orange");
        
        System.out.println("Before sorting: " + list);
        
        Comparator<String> comparator = (o1, o2) -> o1.length() - o2.length();
        
        Collections.sort(list, comparator);
        
        System.out.println("After sorting: " + list);
    }
}           

上述代碼與之前的示例程式非常相似,唯一的不同是我們使用了lambda表達式來建立Comparator對象。該lambda表達式接受兩個參數o1和o2,并傳回它們長度差的值。最後,我們使用Collections.sort()方法對List對象進行排序。

該示例程式的輸出結果與之前相同:

Before sorting: [apple, banana, orange]
After sorting: [apple, orange, banana]
           

上述代碼中,我們使用lambda表達式來建立了一個Comparator對象,并使用它對List進行排序。該lambda表達式接受兩個參數o1和o2,并傳回它們長度差的值。

在Java 8及以後的版本中,使用lambda表達式來建立Comparator對象非常友善。相比于使用匿名内部類,lambda表達式更為簡潔,代碼也更加易讀。

自定義比較器實作降序排列

預設情況下,Java集合架構中的排序算法都是升序排列。如果要按照降序排列,則需要使用自定義比較器來實作。

下面是一個示例程式,展示了如何使用Comparator接口來實作降序排列:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("orange");
        
        System.out.println("Before sorting: " + list);
        
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length() - o1.length();
            }
        };
        
        Collections.sort(list, comparator);
        
        System.out.println("After sorting: " + list);
    }
}
           

上述代碼中,我們将compareTo()方法中的o1和o2的位置互換了一下,進而實作元素的降序排列。最後,我們使用Collections.sort()方法對List對象進行排序。

該示例程式的輸出結果如下:

Before sorting: [apple, banana, orange]
After sorting: [banana, orange, apple]
           

從輸出結果可以看出,我們成功地按字元串長度逆序對List對象進行了排序。

總結

在本文中,我們介紹了Java集合架構中的排序算法。預設情況下,Java中的集合可以使用自然排序進行排序。除此之外,我們還介紹了使用自定義比較器來實作自定義排序算法的方法。通過這些方法,我們可以輕松地對各種類型的集合進行排序,包括數組和List對象。

希望本文對您有所幫助,謝謝!

繼續閱讀