更新時間:2022-05-24 10:52:37 來源:動力節(jié)點 瀏覽4060次
當(dāng)我們使用 Java 字符串時,有時我們想計算一個字符串中有多少個空格。
有多種方法可以得到結(jié)果。在這個快速教程中,我們將通過示例了解如何完成它。
首先,讓我們準(zhǔn)備一個輸入字符串作為示例:
String INPUT_STRING = " This string has nine spaces and a Tab:' '";
上面的字符串包含九個空格和一個用單引號括起來的制表符。我們的目標(biāo)是只計算給定輸入字符串中的空格字符。
因此,我們的預(yù)期結(jié)果是:
int EXPECTED_COUNT = 9;
接下來,讓我們探索各種解決方案以獲得正確的結(jié)果。
我們將首先使用 Java 標(biāo)準(zhǔn)庫來解決問題,然后我們將使用一些流行的外部庫來解決它。
最后,在本教程中,我們將介紹單元測試方法中的所有解決方案。
(1)經(jīng)典解決方案:循環(huán)和計數(shù)
這可能是解決問題的最直接的想法。
我們遍歷輸入字符串中的所有字符。此外,我們維護(hù)一個計數(shù)器變量,并在看到空格字符后遞增計數(shù)器。
最后,我們將獲得字符串中空格的數(shù)量:
@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 開始就已經(jīng)存在。
此外,從 Java 9 開始,String類中添加了一個新的chars()方法,用于將char值從String轉(zhuǎn)換為IntStream實例。
如果我們使用 Java 9 或更高版本,我們可以將這兩個功能結(jié)合起來以單行方式解決問題:
@Test
void givenString_whenCountSpaceByJava8StreamFilter_thenReturnsExpectedCount() {
long spaceCount = INPUT_STRING.chars().filter(c -> c == (int) ' ').count();
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
(3)使用正則表達(dá)式的Matcher.find()方法
到目前為止,我們已經(jīng)看到了通過搜索給定字符串中的空格字符來計數(shù)的解決方案。我們使用了character == ' ' 來檢查一個字符是否是一個空格字符。
正則表達(dá)式(Regex)是搜索字符串的另一個有力武器,Java 對 Regex 有很好的支持。
因此,我們可以將單個空格定義為模式,并使用Matcher.find()方法檢查是否在輸入字符串中找到了該模式。
此外,為了獲得空格數(shù),每次找到模式時我們都會增加一個計數(shù)器:
@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()方法搜索和查找空格非常簡單。但是,由于我們談?wù)摰氖钦齽t表達(dá)式,因此還有其他快速計算空格的方法。
我們知道我們可以使用String.replaceAll()方法進(jìn)行“搜索和替換”。
因此,如果我們將輸入字符串中的所有非空格字符替換為空字符串,則輸入中的所有空格都將是結(jié)果。
所以,如果我們想得到計數(shù),結(jié)果字符串的長度就是答案。接下來,讓我們嘗試一下這個想法:
@Test
void givenString_whenCountSpaceByReplaceAll_thenReturnsExpectedCount() {
int spaceCount = INPUT_STRING.replaceAll("[^ ]", "").length();
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
如上面的代碼所示,我們只有一行來獲取計數(shù)。
值得一提的是,在String.replaceAll()調(diào)用中,我們使用了模式“[^ ]”而不是“\\S”。 這是因為我們想替換非空格字符而不僅僅是非空格字符。
(5)使用String.split() 方法
我們已經(jīng)看到使用String.replaceAll()方法的解決方案簡潔緊湊。現(xiàn)在,讓我們看看解決問題的另一個想法:使用String.split()方法。
眾所周知,我們可以將一個模式傳遞給String.split()方法,并獲得一個由該模式拆分的字符串?dāng)?shù)組。
因此,我們的想法是,我們可以將輸入字符串拆分為一個空格。然后,原始字符串中的空格數(shù)將比字符串?dāng)?shù)組長度少一。
現(xiàn)在,讓我們看看這個想法是否有效:
@Test
void givenString_whenCountSpaceBySplit_thenReturnsExpectedCount() {
int spaceCount = INPUT_STRING.split(" ").length - 1;
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
Apache Commons Lang 3庫廣泛用于 Java 項目。此外,Spring是 Java 愛好者中流行的框架。
這兩個庫都提供了一個方便的字符串實用程序類。
現(xiàn)在,讓我們看看如何使用這些庫計算輸入字符串中的空格。
(1)使用 Apache Commons Lang 3 庫
Apache Commons Lang 3 庫提供了一個StringUtil類,其中包含許多方便的與字符串相關(guān)的方法。
要計算字符串中的空格,我們可以使用此類中的countMatches()方法。
在我們開始使用StringUtil類之前,我們應(yīng)該檢查該庫是否在類路徑中。我們可以在pom.xml中添加最新版本的依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
現(xiàn)在,讓我們創(chuàng)建一個單元測試來展示如何使用這個方法:
@Test
void givenString_whenCountSpaceUsingApacheCommons_thenReturnsExpectedCount() {
int spaceCount = StringUtils.countMatches(INPUT_STRING, " ");
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
(2)使用Spring
如今,很多 Java 項目都是基于 Spring 框架的。因此,如果我們使用 Spring,Spring 提供的一個不錯的字符串實用程序已經(jīng)可以使用:StringUtils。
是的,它與 Apache Commons Lang 3 中的類同名。此外,它提供了一個countOccurrencesOf()方法來計算字符串中字符的出現(xiàn)次數(shù)。
這正是我們正在尋找的:
@Test
void givenString_whenCountSpaceUsingSpring_thenReturnsExpectedCount() {
int spaceCount = StringUtils.countOccurrencesOf(INPUT_STRING, " ");
assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743