在 Java 中查找給定字符串中最長的單詞
一、概述
在本教程中,我們將查找句子中最長的一個或所有單詞。
一個句子是一組單詞。我們將用 Java String
表示它。此外,我們假設每個非空白字符都是單詞的一部分。最後,我們將強調技術邊緣情況:null、空或空白String
沒有最長的單詞。
2. 找到最長的單詞之一
首先,讓我們找到句子中最長的單詞。例如,在句子中:“ This is a phrase with words”
,最長的單詞是phrase
。如果各種單詞的長度相同,則其中任何一個都是可以接受的答案。如果句子沒有單詞,就沒有結果。因此,我們的方法返回一個Optional
:
public Optional<String> findLongestWord(String sentence) {
return Optional.ofNullable(sentence)
.filter(string -> !string.trim().isEmpty())
.map(string -> string.split("\\s"))
.map(Arrays::asList)
.map(list -> Collections.max(list, Comparator.comparingInt(String::length)));
}
我們首先將我們的句子包裝成一個Optional
並過濾掉所有空的和空白的String
。接下來,我們應用String
的split()
方法來檢索單詞數組。我們需要將它“ \\s
”作為參數傳遞,以使用空格作為分隔符。然後,我們使用Arrays.asList()
將數組轉換為List
。最後但同樣重要的是,我們使用**Collections.max()**
來獲取最大長度的單詞。這個方法有兩個屬性:
- 最大值已確定的列表
-
Comparator
用於確定最大值
在我們的例子中,我們通過單詞的長度來比較它們。我們稱我們的類LongestWordFinder
,所以我們現在可以對我們的例句進行單元測試:
@Test
void givenAPhraseWithALongestWord_whenFindLongestWord_thenLongestWordOfThePhrase() {
assertThat(new LongestWordFinder().findLongestWord("This is a phrase with words")).hasValue("phrase");
}
3. 找出所有最長的單詞
我們現在將列出所有最長的單詞。例如, Baeldung
和sentence
是句子中最長的兩個詞:“ Baeldung is another word of size eight in this sentence
”。
首先,我們將擺脫沒有單詞的邊緣情況,並在這種情況下返回一個空列表。此外,我們將再次將句子拆分為單詞數組。然而,這次我們的目標是首先計算最大長度,然後用它來找到所有具有這個長度的單詞:
public List<String> findLongestWords(String sentence) {
if (sentence == null || sentence.trim().isEmpty()) {
return Collections.emptyList();
}
String[] words = sentence.split("\\s");
int maxWordLength = Arrays.stream(words)
.mapToInt(String::length)
.max()
.orElseThrow();
return Arrays.stream(words)
.filter(word -> word.length() == maxWordLength)
.collect(Collectors.toList());
}
如我們所見,為了計算最大長度,我們首先從單詞數組中創建了一個Stream
。然後,我們以String::length
作為參數應用了mapToInt()
中間操作。這樣,我們將Stream
轉換為單詞長度的Stream
。最後,我們得到了Stream
的最大值。
總而言之,我們需要做的就是過濾具有最大長度的單詞。我們使用另一個Stream
來執行此操作並將匹配的單詞收集到結果列表中。現在讓我們檢查一下findLongestWords()
是否為我們的例句返回了預期的結果:
@Test
void givenAPhraseWithVariousWordsOfMaxLength_whenFindLongestWords_thenAllLongestsWords() {
assertThat(new LongestWordFinder().findLongestWords("Baeldung is another word of size eight in this sentence")).containsExactly("Baeldung", "sentence");
}
4。結論
在本文中,我們將一個句子拆分為一個單詞列表,並使用 Collections API 來查找最長的單詞之一。我們還看到瞭如何使用 Java Streams 來找到它們。
一如既往,代碼在 GitHub 上可用。