Java 程序计算每个字符的出现次数

2024年12月8日 | 7 分钟阅读

在本节中,我们将讨论如何计算字符串中字符的频率。例如,考虑单词Javatpoint。在给定的字符串中,字母 j 的频率是 1,a 是 2,v 是 1,t- 是 2,p 是 1,o 是 1,i 是 1,n 是 1。我们将通过不同的方法使用 Java 程序来实现这一点。

有许多解决方案可以计算每个字符的出现次数,其中一些是:

  • 使用朴素方法
  • 使用计数器数组
  • 使用 Java HashMap
  • 使用 Java 8

使用朴素方法

这是计算每个字符出现次数的最简单方法。

CountOccuranceOfChar1.java

输出

The occurrence of P is: 1
The occurrence of n is: 4
The occurrence of e is: 1
The occurrence of u is: 2
The occurrence of m is: 2
The occurrence of o is: 9
The occurrence of l is: 3
The occurrence of t is: 1
The occurrence of r is: 2
The occurrence of a is: 2
The occurrence of i is: 6
The occurrence of c is: 6
The occurrence of s is: 4
The occurrence of p is: 1
The occurrence of v is: 1

使用计数器数组

在下面的 Java 程序中,我们使用了计数器数组来计算字符串中每个字符的出现次数。我们定义了一个 for 循环,该循环会遍历给定的字符串,并根据字符在索引处将计数器变量加 1。然后,我们再次遍历计数器数组,并打印字符和频率(如果 counter[i] 不为 0)。

CountOccuranceOfChar1.java

输出

Please enter a string: javatpoint
a --> 2
i --> 1
j --> 1
n --> 1
o --> 1
p --> 1
t --> 2
v --> 1

使用 Java HashMap

在下面的 Java 程序中,我们使用了 Java HashMap 来计算给定字符串中每个字符的出现次数。我们知道 HashMap 存储键值对,并且不包含重复键。该程序将字符存储为键,将字符的出现次数存储为值。

首先,我们将给定的字符串转换为字符数组,然后逐个遍历字符数组。在 HashMap 中更新计数。之后,对于每个字符,我们需要验证该键是否已存在于 HashMap 中。如果存在,则增加计数变量,否则将其作为新键添加到 map 中,并将初始值设置为 1。

CountOccuranceOfChar2.java

输出

{e=1, g=2, l=1, o=2}

使用 Java 8

在下面的 Java 程序中,我们使用了 Java 8 的功能。首先,我们初始化了一个要计算字符出现次数的字符串。然后,我们创建了一个 Java Map<> 的实例。我们执行了各种中间操作来获取字符的出现次数。

首先,使用 String.split() 方法将给定的字符串分割成数组。然后,Arrays.stream() 方法返回传入数组的流。

第二个中间操作是将字符串转换为小写字母。为此,我们使用了 Stream.map() 方法,该方法返回一个流,其中包含将给定函数应用于此流的元素的结果。

collect() 函数用于执行可变归约操作并连接列表元素。Collectors.groupingBy() 方法返回一个 Collector,它实现了对类型为 T 的输入元素的级联“分组”操作。

为了计算元素,我们使用了 Collectors 类的 counting() 方法。该方法返回一个接受类型为 T 的元素的 Collector。它计算输入元素的数量,如果没有元素,则结果为 0。

CountOccuranceOfChar3.java

输出

{c=2, o=2, m=2, u=1, n=2, i=2, a=1, t=1}

让我们看看相同的另一个逻辑。

下面的 Java 程序逻辑与上面的程序相同,除了某些内容。在下面的 Java 程序中,我们使用了 Java Pattern 类。

首先,我们调用 compile() 方法,该方法将给定的正则表达式编译成一个模式。然后,我们调用 matcher() 函数,该函数创建一个匹配器(匹配给定输入与此模式)。

最后,我们创建了一个 Map 对象,计算存储在 map 中的元素。计数后,使用 forEach() 循环遍历 map。该解决方案适用于 Java 8 或更高版本。

CountOccuranceOfChar4.java

输出

m = 1 times
o = 3 times
n = 1 times
p = 1 times
l = 1 times
y = 1 times

Java 程序计算每个字符出现次数选择题

1. 在 Java 中,当输入规模较大且内存效率至关重要时,哪种方法最适合计算字符串中字符的出现次数?

  1. 朴素方法
  2. 计数器数组
  3. Java HashMap
  4. Java 8 Stream API

答案:B

解释:使用计数器数组(大小为 256 的 ASCII 字符的 int 数组)是提供的选项中最节省内存的方法,因为它直接将每个字符映射到其 ASCII 值并在该索引处递增计数。


2. 与计数器数组相比,使用 Java HashMap 在计算字符串中字符出现次数方面提供了什么优势?

  1. HashMap 允许更快的查找操作。
  2. HashMap 可以处理非 ASCII 字符。
  3. HashMap 会自动按出现次数对字符进行排序。
  4. HashMap 为插入提供恒定的时间复杂度。

答案:B

解释:与仅限于 ASCII 字符的计数器数组不同,Java 中的 HashMap 可以处理任何 Unicode 字符,使其可用于各种字符集和语言。


3. 在以下哪种情况下,使用 Java 8 Stream API 计算字符串中字符的出现次数可能不太合适?

  1. 当输入字符串包含重复字符时。
  2. 当输入字符串很短且内存使用不是问题时。
  3. 当要求保持字符的插入顺序时。
  4. 当性能优化至关重要时。

答案:B

解释:与数组或 HashMap 等简单数据结构相比,Java 8 Stream API 会引入开销。它对于复杂的操作或大型数据集很有用,但对于小型、简单的任务来说可能有点过度。


4. 在计算字符串中字符出现次数的场景中,其中需要保留字符顺序,最合适的数据结构是什么?

  1. HashSet
  2. TreeMap
  3. LinkedHashMap
  4. ArrayList

答案:C

解释:LinkedHashMap 维护键的插入顺序,使其适用于需要保留字符串中字符首次出现顺序的任务。


5. 在 Java 中使用计数器数组计算字符出现次数有什么潜在的缺点?

  1. 它需要为每个字符进行额外的内存分配。
  2. 它无法处理非 ASCII 字符。
  3. 它不为查找操作提供恒定的时间复杂度。
  4. 它可能会浪费不出现在字符串中的字符的内存。

答案:D

解释:计数器数组会为所有可能的 ASCII 字符(256 个槽)分配内存,而不管它们是否出现在字符串中,如果许多槽保持未使用,这可能会导致内存使用效率低下。


下一个主题Java 技术列表