檢查清單是否包含字串元素,同時忽略大小寫
1. 概述
List
是Java中非常常用的資料結構。有時,我們想要不區分大小寫來檢查字串是否是字串清單中的元素。
在本快速教學中,我們將探索解決 Java 中這個常見問題的各種方法和策略。
2.問題介紹
List
提供了方便的contains()
方法來檢查清單中是否存在給定值。在底層, List.contains()
透過equals()
方法將給定物件與清單中的每個元素進行比較。
因此,如果列表是List<String>,
則contains()
方法僅比較字串區分大小寫。例如,我們有一個電影標題清單:
List<String> THE_LIST = List.of("Game of Thrones", "Forrest Gump", "American Beauty", "Pretty Woman", "Catch Me If You Can");
當我們使用contains()
方法檢查它是否有「 catch me if you can
」時,它會傳回false:
assertFalse(THE_LIST.contains("catch me if you can"));
然而,在許多情況下,我們希望contains()
方法支援忽略大小寫的檢查。不幸的是,標準contains()
並沒有為我們提供這個選項。那麼接下來,讓我們看看如何實現我們的目標。
為簡單起見,我們將利用單元測試斷言來驗證每種方法是否如預期般運作。
3. 使用循環
我們知道String
類別提供了equalsIgnoreCase()
方法,該方法執行不區分大小寫的相等檢查。因此,解決我們問題的第一個想法是循環遍歷列表並使用equalsIgnoreCase()
方法檢查每個元素和給定值:
boolean ignoreCaseContainsForLoop(List<String> list, String value) {
for (String e : list) {
if (value.equalsIgnoreCase(e)) {
return true;
}
}
return false;
}
如上面的程式碼所示,我們使用for
迴圈來檢查清單中的每個元素。一旦equalsIgnoreCase()
方法在某個元素上報告true
,我們會立即傳回true
並停止進一步檢查。否則,如果在清單中的所有元素中找不到匹配項,則該方法傳回false.
我們可以建立一個測試來驗證ignoreCaseContainsForLoop()
方法是否如預期般運作:
assertTrue(ignoreCaseContainsForLoop(THE_LIST, "CATCH me if you CAN"));
assertTrue(ignoreCaseContainsForLoop(THE_LIST, "game of thrones"));
assertFalse(ignoreCaseContainsForLoop(THE_LIST, "The Godfather"));
4. 使用串流API
Java從版本8開始引入了Stream API。Stream API提供了一個強大的機制來有效率且有效地處理集合。
接下來,讓我們使用 Stream API 來解決我們的問題:
assertTrue(THE_LIST.stream().anyMatch(e -> e.equalsIgnoreCase("CATCH me if you CAN")));
如圖所示,我們利用 Stream API 中的anyMatch()
方法來確定元素是否符合我們的條件。我們使用 lambda 表達式將我們的條件傳遞給anyMatch()
。
或者,我們可以選擇使用方法來引用將謂詞傳遞給anyMatch()
方法:
assertTrue(THE_LIST.stream().anyMatch("game of thrones"::equalsIgnoreCase));
assertFalse(THE_LIST.stream().anyMatch("The Godfather"::equalsIgnoreCase));
5. 結論
在本文中,我們探討了兩種執行不區分大小寫檢查以確定字串清單是否包含特定字串的方法。
首先,我們透過設計傳統的基於循環的方法來解決這個問題。接下來,我們利用 Stream API 的anyMatch()
方法的強大功能來實現相同的目標。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。