加入列表<String>Java 中使用逗號和“and”
1. 概述
使用字串集合時,使用特定分隔符號連接這些字串是一項常見任務。幸運的是,我們可以使用各種解決方案,包括使用String.join()
和Collectors.joining()
。
在這個快速教程中,我們將探討一個有趣的字串連接問題:以更自然的類似語言的方式連接字串。
2.問題介紹
讓我們透過一個例子來理解這個問題。假設我們有一個字串列表{“A”, “B”, “C”, “D”}.
如果我們想用逗號作為分隔符號將它們連接起來,結果將是「 A, B, C, D
」。到目前為止,一切都很好。
但是,如果我們希望連結結果遵循英語文法,則預期結果應該是「 A, B, C and D
」或「 A, B, C, and D
」。稍後我們會看到為什麼有兩種變體。但是,至少我們知道結果不是我們可以直接從String.join()
或Collectors.joining()
方法呼叫獲得的。
上例「 C
」和“and”
之間的逗號稱為牛津逗號或哈佛逗號。人們正在討論哪種風格更精確。但這不是我們的重點。我們的目標是創建一種支持這兩種情況的方法。
因此,給定一個包含兩個以上字串元素的列表,例如{“A”, “B”, “C”, … “X”, “Y”}
,根據要求,我們可能會得到兩個結果:
- 帶有牛津逗號 – “
A, B, C, …. X and Y
“ - 沒有牛津逗號- “
A, B, C, … X, and Y
“
此外,我們只討論了至少包含三個元素的清單。如果清單包含的元素少於三個,結果可能會有所不同:
- 對於空列表,返回空字串,因此,
**{ }**
變成**s****“”**
- 對於包含單一元素的列表,傳回該元素。例如,
**{“A”}**
變成**“****“A”**
- 當處理包含兩個字串元素的列表時,將它們與單字“
and
”組合起來,而不使用逗號。例如,{“A”, “B”}
變成“A and B”
接下來,讓我們建立一個以類似自然語言的方式連接字串清單的方法。為簡單起見,我們假設輸入清單不為 null 且不包含 null 或空字串元素。在實踐中,如果列表包含空或空字串,我們可以先過濾掉這些元素。
3. 建立joinItemsAsNaturalLanguage()
方法
首先我們來看看方法的實現,然後了解它是如何運作的:
String joinItemsAsNaturalLanguage(List<String> list, boolean oxfordComma) {
if (list.size() < 3) {
return String.join(" and ", list);
}
// list has at least three elements
int lastIdx = list.size() - 1;
StringBuilder sb = new StringBuilder();
return sb.append(String.join(", ", list.subList(0, lastIdx)))
.append(oxfordComma ? ", and " : " and ")
.append(list.get(lastIdx))
.toString();
}
現在,讓我們快速瀏覽一下程式碼。首先,我們使用String.join(” and “, list).
然後,如果清單包含三個或更多字串,我們以“, “
作為分隔符號將元素連接到 input 的子清單中,其中不包括最後一個字串。最後,我們將連接結果與最後一個元素以“and”
連接起來。當然,也考慮oxfordComma
選項。
值得注意的是,我們不應該採取用逗號連接所有元素的方法 首先並將最後一個逗號替換為**“and”** .
這是因為最後一個元素也可能包含逗號。
讓我們測試一下沒有牛津逗號的解決方案:
assertEquals("", joinItemsAsNaturalLanguage(emptyList(), false));
assertEquals("A", joinItemsAsNaturalLanguage(List.of("A"), false));
assertEquals("A and B", joinItemsAsNaturalLanguage(List.of("A", "B"), false));
assertEquals("A, B, C, D and I have a comma (,)", joinItemsAsNaturalLanguage(List.of("A", "B", "C", "D", "I have a comma (,)"), false));
最後,我們用牛津逗號來測試一下:
assertEquals("", joinItemsAsNaturalLanguage(emptyList(), true));
assertEquals("A", joinItemsAsNaturalLanguage(List.of("A"), true));
assertEquals("A and B", joinItemsAsNaturalLanguage(List.of("A", "B"), true));
assertEquals("A, B, C, D, and I have a comma (,)", joinItemsAsNaturalLanguage(List.of("A", "B", "C", "D", "I have a comma (,)"), true));
4。結論
在本文中,我們討論了以類似自然語言的方式連接字串清單的問題。此外,我們也學習如何創建一種方法來解決這個問題。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。