在 Java 中取得名字的首字母
一、簡介
處理名稱時,使用每個單字的第一個字元將其縮短為縮寫字串可能會很有幫助。在本教程中,我們將了解在 Java 中實作此功能的不同方法。
2. 假設
在創建縮寫時,我們僅考慮以字母開頭的單字。任何其他詞都被排除在該過程之外。此外,縮寫可能會導致沒有有效單字的空字串。此外,我們將整個字串轉換為大寫。
3. 使用循環
我們可以按空格分割文字並使用 for 迴圈來迭代每個單字。隨後,我們可以取每個有效單字的第一個字元並建立縮寫:
String getInitialUsingLoop(String name) {
if (name == null || name.isEmpty()) {
return "";
}
String[] parts = name.split("\\s+");
StringBuilder initials = new StringBuilder();
for (String part : parts) {
if (part.matches("[a-zA-Z].*")) {
initials.append(part.charAt(0));
}
}
return initials.toString().toUpperCase();
}
在上面的程式碼中,我們使用正規表示式檢查單字是否以字母開頭,然後提取第一個字元以形成縮寫。
我們可以使用 JUnit 編寫單元測試來檢查不同的情況:
@ParameterizedTest
@CsvSource({"John F Kennedy,JFK", ",''", "'',''", "Not Correct 88text,NC", "michael jackson,MJ", "123,''", "123 234A,''", "1test 2test, ''"})
void getInitialFromName_usingLoop(String input, String expected) {
String initial = getInitialUsingLoop(input);
assertEquals(expected, initial);
}
在上面的測試案例中,我們利用JUnit的參數化測試功能來指定多個輸入和預期輸出組合。因此,我們可以確保在不同條件下全面覆蓋和驗證功能。
4.使用StringTokenizer
我們可以使用StringTokenizer
將文字拆分為單字。我們看一下實作:
String getInitialUsingStringTokenizer(String name)
if (name == null || name.isEmpty()) {
return "";
}
StringTokenizer tokenizer = new StringTokenizer(name);
StringBuilder initials = new StringBuilder();
while (tokenizer.hasMoreTokens()) {
String part = tokenizer.nextToken();
if (part.matches("[a-zA-Z].*")) {
initials.append(part.charAt(0));
}
}
return initials.toString().toUpperCase();
}
此程式碼與先前的實作類似,只是我們使用StringTokenizer
而不是split()
方法。
對於此方法,我們可以使用與先前相同的參數化測試。
5. 使用正規表示式
實現此功能的另一種方法是使用正規表示式。我們可以使用**Regex Capture**捕捉每個有效單字的第一個字元:
String getInitialUsingRegex(String name) {
if (name == null || name.isEmpty()) {
return "";
}
Pattern pattern = Pattern.compile("\\b[a-zA-Z]");
Matcher matcher = pattern.matcher(name);
StringBuilder initials = new StringBuilder();
while (matcher.find()) {
initials.append(matcher.group());
}
return initials.toString().toUpperCase();
}
同樣,我們可以建立一個測試案例來驗證實作。
6. 使用串流API
我們也可以使用基於函數式程式設計的 Stream API,該 API 自 Java 8 起就可用。現在,讓我們深入研究一下實現:
String getInitialUsingStreamsAPI(String name) {
if (name == null || name.isEmpty()) {
return "";
}
return Arrays.stream(name.split("\\s+"))
.filter(part -> part.matches("[a-zA-Z].*"))
.map(part -> part.substring(0, 1))
.collect(Collectors.joining())
.toUpperCase();
}
在這種情況下,我們結合了filter()
、 map()
和collect()
方法來實現目標。我們也可以使用類似的參數化測試來驗證此實作。
七、結論
本文討論了從 Java 中提取姓名首字母的各種方法。這些方法還可以產生任何文字的首字母縮略詞,而不僅僅是名稱。此外,我們還探索了傳統的基於循環的方法、正規表示式和更多函數式程式設計方法來實現相同的結果。根據特定場景,開發人員可以選擇最適合自己需求的方法。
與往常一樣,本教程中使用的範例程式碼可在 GitHub 上取得。