1. 概述

在Java编程中,处理字符串(/java-string)中的字符计数是常见的操作。一个有效的方法是使用哈希映射(HashMap)来存储字符串中每个字符的频率。

在这个教程中,我们将探讨如何在Java中创建一个包含给定字符串字符计数的哈希映射。

2. 使用传统循环

创建带有字符串字符计数的哈希映射的一种简单方法是使用传统的循环(/java-loops)。这种方法中,我们遍历字符串中的每个字符,并相应地更新哈希映射中每个字符的计数。

让我们看看如何实现:

String str = "abcaadcbcb";
@Test
public void givenString_whenUsingLooping_thenVerifyCounts() {
    Map<Character, Integer> charCount = new HashMap<>();
    for (char c : str.toCharArray()) {
        charCount.merge(c, 1, Integer::sum);
    }
    assertEquals(3, charCount.get('a').intValue());
}

在测试方法中,我们首先创建一个名为charCount的映射对象,用于存储字符计数。然后,我们遍历字符串str中的每个字符。对于每个字符,我们使用Map接口的merge()方法更新charCount映射中该字符的出现次数。

如果遇到字符第一次,我们将其计数初始化为1;否则,我们将现有计数加1。最后,我们验证charCount映射正确地存储了字符'a'的计数为3。

3. 使用Java流

另一种选择是利用Java流(/java-8-streams-introduction)以更简洁的功能性方式实现相同的结果。通过流,我们可以轻松地对字符串中的字符进行分组并计算其出现次数。以下是使用Java流实现的示例:

@Test
public void givenString_whenUsingStreams_thenVerifyCounts() {
    Map<Character, Integer> charCount = str.chars()
        .boxed()
        .collect(toMap(
          k -> (char) k.intValue(),
          v -> 1,
          Integer::sum));
    assertEquals(3, charCount.get('a').intValue());
}

首先,我们使用chars()方法将str字符串转换为IntStream。接下来,每个表示Unicode代码点的整数被boxed()方法封装为Character对象,得到一个Stream<Character>。然后,我们使用collect()方法累积流元素到一个Map<Character, Integer>中。

toMap()收集器在此处至关重要,它将每个字符映射到其计数。在收集器内部,我们定义了三个参数:一个键映射函数,将每个字符转换为Character对象;一个值映射函数,为遇到的每个字符分配计数1;以及一个合并函数Integer::sum,通过相加具有相同键的字符的值来聚合计数。

4. 总结

在这篇文章中,我们创建了一个带有字符串字符计数的哈希映射。无论是使用传统循环还是Java流,关键都是有效地遍历字符串中的字符,并更新哈希映射中的计数。

如往常一样,本文的完整代码示例可以在GitHub上找到。