更新時間:2022-05-24 10:52:37 來源:動力節點 瀏覽4034次
當我們使用 Java 字符串時,有時我們想計算一個字符串中有多少個空格。
有多種方法可以得到結果。在這個快速教程中,我們將通過示例了解如何完成它。
首先,讓我們準備一個輸入字符串作為示例:
String INPUT_STRING = " This string has nine spaces and a Tab:' '";
上面的字符串包含九個空格和一個用單引號括起來的制表符。我們的目標是只計算給定輸入字符串中的空格字符。
因此,我們的預期結果是:
int EXPECTED_COUNT = 9;
接下來,讓我們探索各種解決方案以獲得正確的結果。
我們將首先使用 Java 標準庫來解決問題,然后我們將使用一些流行的外部庫來解決它。
最后,在本教程中,我們將介紹單元測試方法中的所有解決方案。
(1)經典解決方案:循環和計數
這可能是解決問題的最直接的想法。
我們遍歷輸入字符串中的所有字符。此外,我們維護一個計數器變量,并在看到空格字符后遞增計數器。
最后,我們將獲得字符串中空格的數量:
@Test
void givenString_whenCountSpaceByLooping_thenReturnsExpectedCount() {
int spaceCount = 0;
for (char c : INPUT_STRING.toCharArray()) {
if (c == ' ') {
spaceCount++;
}
}
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
(2)使用 Java 8 的 Stream API
Stream API從 Java 8 開始就已經存在。
此外,從 Java 9 開始,String類中添加了一個新的chars()方法,用于將char值從String轉換為IntStream實例。
如果我們使用 Java 9 或更高版本,我們可以將這兩個功能結合起來以單行方式解決問題:
@Test
void givenString_whenCountSpaceByJava8StreamFilter_thenReturnsExpectedCount() {
long spaceCount = INPUT_STRING.chars().filter(c -> c == (int) ' ').count();
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
(3)使用正則表達式的Matcher.find()方法
到目前為止,我們已經看到了通過搜索給定字符串中的空格字符來計數的解決方案。我們使用了character == ' ' 來檢查一個字符是否是一個空格字符。
正則表達式(Regex)是搜索字符串的另一個有力武器,Java 對 Regex 有很好的支持。
因此,我們可以將單個空格定義為模式,并使用Matcher.find()方法檢查是否在輸入字符串中找到了該模式。
此外,為了獲得空格數,每次找到模式時我們都會增加一個計數器:
@Test
void givenString_whenCountSpaceByRegexMatcher_thenReturnsExpectedCount() {
Pattern pattern = Pattern.compile(" ");
Matcher matcher = pattern.matcher(INPUT_STRING);
int spaceCount = 0;
while (matcher.find()) {
spaceCount++;
}
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
(4)使用String.replaceAll()方法
使用Matcher.find()方法搜索和查找空格非常簡單。但是,由于我們談論的是正則表達式,因此還有其他快速計算空格的方法。
我們知道我們可以使用String.replaceAll()方法進行“搜索和替換”。
因此,如果我們將輸入字符串中的所有非空格字符替換為空字符串,則輸入中的所有空格都將是結果。
所以,如果我們想得到計數,結果字符串的長度就是答案。接下來,讓我們嘗試一下這個想法:
@Test
void givenString_whenCountSpaceByReplaceAll_thenReturnsExpectedCount() {
int spaceCount = INPUT_STRING.replaceAll("[^ ]", "").length();
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
如上面的代碼所示,我們只有一行來獲取計數。
值得一提的是,在String.replaceAll()調用中,我們使用了模式“[^ ]”而不是“\\S”。 這是因為我們想替換非空格字符而不僅僅是非空格字符。
(5)使用String.split() 方法
我們已經看到使用String.replaceAll()方法的解決方案簡潔緊湊。現在,讓我們看看解決問題的另一個想法:使用String.split()方法。
眾所周知,我們可以將一個模式傳遞給String.split()方法,并獲得一個由該模式拆分的字符串數組。
因此,我們的想法是,我們可以將輸入字符串拆分為一個空格。然后,原始字符串中的空格數將比字符串數組長度少一。
現在,讓我們看看這個想法是否有效:
@Test
void givenString_whenCountSpaceBySplit_thenReturnsExpectedCount() {
int spaceCount = INPUT_STRING.split(" ").length - 1;
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
Apache Commons Lang 3庫廣泛用于 Java 項目。此外,Spring是 Java 愛好者中流行的框架。
這兩個庫都提供了一個方便的字符串實用程序類。
現在,讓我們看看如何使用這些庫計算輸入字符串中的空格。
(1)使用 Apache Commons Lang 3 庫
Apache Commons Lang 3 庫提供了一個StringUtil類,其中包含許多方便的與字符串相關的方法。
要計算字符串中的空格,我們可以使用此類中的countMatches()方法。
在我們開始使用StringUtil類之前,我們應該檢查該庫是否在類路徑中。我們可以在pom.xml中添加最新版本的依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
現在,讓我們創建一個單元測試來展示如何使用這個方法:
@Test
void givenString_whenCountSpaceUsingApacheCommons_thenReturnsExpectedCount() {
int spaceCount = StringUtils.countMatches(INPUT_STRING, " ");
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
(2)使用Spring
如今,很多 Java 項目都是基于 Spring 框架的。因此,如果我們使用 Spring,Spring 提供的一個不錯的字符串實用程序已經可以使用:StringUtils。
是的,它與 Apache Commons Lang 3 中的類同名。此外,它提供了一個countOccurrencesOf()方法來計算字符串中字符的出現次數。
這正是我們正在尋找的:
@Test
void givenString_whenCountSpaceUsingSpring_thenReturnsExpectedCount() {
int spaceCount = StringUtils.countOccurrencesOf(INPUT_STRING, " ");
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習