根據字串長度對字串數組進行排序
1. 概述
在本教程中,我們將探索根據元素的長度對字串陣列進行排序的不同方法。
2. Comparator
當我們在 Java 中進行排序時,我們經常定義一個Comparator
來傳回兩個參數之間的順序。排序演算法應用Comparator
產生的排序順序並傳回排序結果。
定義Comparator
時,我們實作以下方法:
int compare(T o1, T o2);
根據 Java API,如果o1
小於o2
,則此方法必須傳回負值;如果兩者相等,則此方法必須傳回零;如果o1
大於o2
則此方法必須傳回正值。
在後面部分的範例中,我們將使用這個未排序的字串陣列來進行說明:
String[] inputArray = new String[] {"am", "today", "too", "I", "busy"};
當inputArray
按字串長度排序時,我們期望得到以下陣列:
String[] SORTED = new String[] {"I", "am", "too", "busy", "today"};
3. 透過自訂比較器進行比較
最簡單的方法是定義一個自訂字串Comparator
,根據字串長度進行數字比較:
public class StringLengthComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}
我們將呼叫Array.sort()
對數組進行排序。在我們的例子中,我們必須提供第二個參數,也就是我們的自訂比較器。否則,排序將基於自然順序:
@Test
void whenSortByCustomComparator_thenArraySorted() {
StringLengthComparator comparator = new StringLengthComparator();
Arrays.sort(inputArray, comparator);
assertThat(inputArray).isEqualTo(SORTED);
}
根據我們的需要,如果Comparator
是一次性使用的,我們可以定義一個匿名類別而不是單獨的類別:
@Test
void whenSortByInnerClassComparator_thenArraySorted() {
Arrays.sort(inputArray, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
assertThat(inputArray).isEqualTo(SORTED);
}
4. 透過 Lambda 表達式進行比較
由於 Java 8 引入了 lambda 表達式,因此我們可以透過提供 lambda 表達式而不是使用匿名類別來簡化先前的方法。 lambda 是一個可以作為物件傳遞的匿名函數。
使用 lambda 表達式,我們可以將比較函數作為第二個參數傳遞給Array.sort()
,而無需明確定義任何類別。這大大提高了程式碼的可讀性:
@Test
void whenSortedByLambda_thenArraySorted() {
Arrays.sort(inputArray, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
assertThat(inputArray).isEqualTo(SORTED);
}
此範例的作用與上一節中的相同。當我們使用 lambda 表達式定義它時,它會更加簡潔。
5. 透過比較功能進行比較
Java 8也在Comparator
類別中引入了方便的比較靜態函數。
Comparator.comparingInt()
是我們可以在這裡採用的。此靜態函數接受傳回整數的方法參考。對於以下範例,我們將應用String::length
作為取得字串長度的方法引用:
@Test
void whenSortedByComparingInt_thenArraySorted() {
Arrays.sort(inputArray, Comparator.comparingInt(String::length));
assertThat(inputArray).isEqualTo(SORTED);
}
同樣,這與前一個相同,但語法更加簡化。
六,結論
在本文中,我們探索了不同的排序方法。它基於向Array.sort()
提供一個專用的Comparator
,該比較器根據字串的長度對字串陣列進行排序。
可以從自訂Comparator
類別、lambda 表達式或比較函數建立Comparator
。
像往常一樣,完整的程式碼範例可以在 GitHub 上找到。