計算字串中的大寫和小寫字母
1. 概述
在 Java 中使用String
類型時,通常需要分析其中字元的組成。一項常見任務是計算給定String
中大寫和小寫字母的數量。
在本教程中,我們將探索幾種簡單實用的方法來使用 Java 來實現這一目標。
2.問題介紹
在深入研究程式碼之前,我們先澄清一下當前的問題。我們想要建立一個 Java 方法,它將String
作為輸入並同時計算大寫和小寫字母的數量。換句話說,該解決方案將產生包含兩個計數器的結果。
例如,我們將使用以下String
作為輸入:
static final String MY_STRING = "Hi, Welcome to Baeldung! Let's count letters!";
大寫字母是從“ A
”到“ Z
”的字符,小寫字母是從“ a
”到“ z
”的字符。即「,」、「!」等特殊字符在範例String
中,既不考慮大寫字母,也不考慮小寫字母。
檢視範例, MY_STRING.
由於我們將同時計算兩個計數器,因此讓我們建立一個簡單的結果類別來攜帶兩個計數器,以便我們可以更輕鬆地驗證結果:
class LetterCount {
private int uppercaseCount;
private int lowercaseCount;
private LetterCount(int uppercaseCount, int lowercaseCount) {
this.uppercaseCount = uppercaseCount;
this.lowercaseCount = lowercaseCount;
}
public int getUppercaseCount() {
return uppercaseCount;
}
public int getLowercaseCount() {
return lowercaseCount;
}
// ... counting solutions come later ...
}
稍後,我們會將計數解決方案作為靜態方法新增至此類。
因此,如果一種方法正確地計算字母數,它應該會產生一個具有uppercaseCount = 4
和lowercaseCount = 31
的LetterCount
物件。
接下來,我們來數一下字母。
3. 使用字元範圍
為了解決這個問題,我們將迭代給定String
中的每個字符,並透過檢查它是否屬於相應的字符範圍之一來確定它是大寫字母還是小寫字母:
static LetterCount countByCharacterRange(String input) {
int upperCount = 0;
int lowerCount = 0;
for (char c : input.toCharArray()) {
if (c >= 'A' && c <= 'Z') {
upperCount++;
}
if (c >= 'a' && c <= 'z') {
lowerCount++;
}
}
return new LetterCount(upperCount, lowerCount);
}
如上面的程式碼所示,我們為大寫和小寫字母維護單獨的計數器,並在迭代過程中相應地增加它們。遍歷輸入String
後,我們使用兩個計數器建立LetterCount
物件並將其作為結果傳回:
LetterCount result = LetterCount.countByCharacterRange(MY_STRING);
assertEquals(4, result.getUppercaseCount());
assertEquals(31, result.getLowercaseCount());
值得注意的是,這種方法僅適用於由 ASCII 字元組成的String
輸入。
4. 使用isUpperCase()
和isLowerCase()
方法
在前面的解決方案中,我們透過檢查字元的範圍來確定字元是大寫字母還是小寫字母。實際上, Character
類別已經為這種檢查提供了isUpperCase()
和isLowerCase()
方法。
需要強調的是**isUpperCase()
和isLowerCase()
也適用於 Unicode 字元**:
assertTrue(Character.isLowerCase('ä'));
assertTrue(Character.isUpperCase('Ä'));
因此,讓我們用Character
類別中的大小寫檢查方法來取代範圍檢查:
static LetterCount countByCharacterIsUpperLower(String input) {
int upperCount = 0;
int lowerCount = 0;
for (char c : input.toCharArray()) {
if (Character.isUpperCase(c)) {
upperCount++;
}
if (Character.isLowerCase(c)) {
lowerCount++;
}
}
return new LetterCount(upperCount, lowerCount);
}
正如我們所看到的,這兩種案例檢查方法使程式碼更容易理解,並且產生了預期的結果:
LetterCount result = LetterCount.countByCharacterIsUpperLower(MY_STRING);
assertEquals(4, result.getUppercaseCount());
assertEquals(31, result.getLowercaseCount());
5.使用Stream API的filter()
和count()
方法
Stream API 是 Java 8 中引入的重要功能。
接下來,讓我們使用 Stream API 中的filter()
和count()
來解決這個問題:
static LetterCount countByStreamAPI(String input) {
return new LetterCount(
(int) input.chars().filter(Character::isUpperCase).count(),
(int) input.chars().filter(Character::isLowerCase).count()
);
}
由於**count()
方法傳回一個long
值**,我們必須將其轉換為int
來實例化LetterCount
物件。
乍一看,該解決方案比其他基於循環的方法更簡單、更緊湊。然而,值得注意的是,這種方法會遍歷輸入String
中的字元兩次。
最後,讓我們寫一個測試來驗證這個方法是否會產生預期結果:
LetterCount result = LetterCount.countByStreamAPI(MY_STRING);
assertEquals(4, result.getUppercaseCount());
assertEquals(31, result.getLowercaseCount());
六,結論
在本文中,我們探索了計算給定String
中大寫和小寫字母的不同方法。
這些簡單而有效的方法為現實工作中更複雜的String
分析任務提供了基礎。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。