在 Java 中檢查字符串是否全部為大寫或小寫
一、概述
在 Java 中處理字符串時,通常需要確定字符串是否完全由大寫字符或小寫字符組成。
在本教程中,我們將探討執行檢查的不同方法。
二、問題介紹
首先,讓我們準備三個輸入字符串:
static final String UPPER_INPUT = "1: COOL!";
static final String LOWER_INPUT = "2: cool!";
static final String MIXED_INPUT = "3: Cool!";
正如我們所看到的,上面的每個字符串都包含一個空格和兩個標點符號。數字、標點等非字母字符是否屬於大寫/小寫取決於需求。在本教程中,我們將非字母字符視為大寫和小寫字符。
我們將在CaseCheck
類中創建static
檢查方法:
class CaseChecker {
static boolean allUpperX(String input){...}
static boolean allLowerX(String input){...}
...
}
通過利用 Java 的String
類和字符操作的強大功能,我們可以輕鬆地執行這些檢查並處理各種用例。
為簡單起見,我們將使用單元測試斷言來驗證每種方法是否返回預期結果。
現在,讓我們開始吧!
3.轉換比較
我們知道String
類為我們提供了兩種方法: toUpperCase()
和toLowerCase()
。如果字符串 ( s
) 的字符為大寫,則字符串 ( s
) 必須等於s.toUpperCase()
的結果。所以,按照這個思路,我們來創建兩個檢查方法,一個是大寫檢查,一個是小寫檢查:
static boolean allUpper1(String input) {
return input.equals(input.toUpperCase());
}
static boolean allLower1(String input) {
return input.equals(input.toLowerCase());
}
接下來,讓我們使用準備好的輸入字符串測試這些方法:
assertTrue(CaseChecker.allLower1(LOWER_INPUT));
assertFalse(CaseChecker.allLower1(UPPER_INPUT));
assertFalse(CaseChecker.allLower1(MIXED_INPUT));
assertFalse(CaseChecker.allUpper1(LOWER_INPUT));
assertTrue(CaseChecker.allUpper1(UPPER_INPUT));
assertFalse(CaseChecker.allUpper1(MIXED_INPUT));
如果我們執行它,測試就會通過。所以檢查方法解決了這個問題。
4.檢查每個字符
雖然我們使用轉換和比較方法成功解決了這個問題,例如input.equals(input.toUpperCase())
,但在處理長輸入字符串時,此方法可能不是最佳方法。它轉換每個字符的大小寫。因此,此過程可能變得非常耗時,並且對於冗長的輸入字符串來說可能是不必要的。
另一個想法是遍歷輸入字符串中的字符。一旦我們檢測到一個不是大寫/小寫的字符,我們就可以確定結果。所以我們可以跳過任何進一步的檢查。
我們可以使用String.toCharArray()
將字符串分解為char
數組.
此外, Character.isLowerCase()
和Character.isUpperCase()
方法可以告訴我們char
是小寫還是大寫字符。
接下來,讓我們結合這兩種方法並創建我們的檢查方法:
static boolean allUpper2(String input) {
for (char c : input.toCharArray()) {
// don't write in this way: if (!Character.isUpperCase(c))
if (Character.isLowerCase(c)) {
return false;
}
}
return true;
}
static boolean allLower2(String input) {
for (char c : input.toCharArray()) {
// don't write in this way: if (!Character.isLowerCase(c))
if (Character.isUpperCase(c)) {
return false;
}
}
return true;
}
實現並不難理解。但是,您可能會對上面代碼中的註釋感到疑惑。例如,在allUpper2()
中,為什麼我們不應該寫“ if
( !Character.isUpperCase(c)) return false;”
?
這是因為給定了任何非字母字符,例如“.”。或 '7',都是Character
。 isUpperCase()
和isLowerCase()
返回false
。但是根據需要,我們需要在大小寫檢查邏輯中忽略非字母字符。因此,使用“ if
( Character.isLowerCase(c)) return false;”
更合適。而不是“ if
( !Character.isUpperCase(c)) return false;”
測試表明我們的檢查方法也可以完成這項工作:
assertTrue(CaseChecker.allLower2(LOWER_INPUT));
assertFalse(CaseChecker.allLower2(UPPER_INPUT));
assertFalse(CaseChecker.allLower2(MIXED_INPUT));
assertFalse(CaseChecker.allUpper2(LOWER_INPUT));
assertTrue(CaseChecker.allUpper2(UPPER_INPUT));
assertFalse(CaseChecker.allUpper2(MIXED_INPUT));
或者,我們可以使用 Stream API 實現相同的邏輯:
static boolean allUpper3(String input) {
return input.chars().noneMatch(Character::isLowerCase);
}
static boolean allLower3(String input) {
return input.chars().noneMatch(Character::isUpperCase);
}
5. 關於 Apache Commons Long 3 庫中的StringUtils
的一句話
Apache Commons Lang 3 提供了方便的StringUtils
類。這個實用程序類有兩個方法: isAllLowerCase()
和isAllUpperCase()
。
值得注意的是,這些方法考慮非字母字符,既不是大寫也不是小寫:
assertFalse(StringUtils.isAllLowerCase(LOWER_INPUT));
assertFalse(StringUtils.isAllLowerCase(UPPER_INPUT));
assertFalse(StringUtils.isAllLowerCase(MIXED_INPUT));
assertFalse(StringUtils.isAllLowerCase("ab"));
assertTrue(StringUtils.isAllLowerCase("ab"));
assertFalse(StringUtils.isAllUpperCase(LOWER_INPUT));
assertFalse(StringUtils.isAllUpperCase(UPPER_INPUT));
assertFalse(StringUtils.isAllUpperCase(MIXED_INPUT));
assertFalse(StringUtils.isAllUpperCase("AB"));
assertTrue(StringUtils.isAllUpperCase("AB"));
我們在使用它們時應該牢記這一點。
六,結論
在本文中,我們探討了在 Java 中檢查字符串是否全部為大寫或小寫的不同方法。轉換和比較方法 很簡單。但是如果輸入字符串很長,我們可能希望檢查所有字符並提前退出以獲得更好的性能。
與往常一樣,此處提供的所有代碼片段都可以在 GitHub 上找到。