当我们使用 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);
}
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习