我的目标是制作一个函数来计算某些符号(字符)在一行中的出现次数。 一个 int ID 给了我需要计算的每个字符。 字符集是有限的,我从一开始就知道。 所有行仅由给定集中的字符组成。 该函数处理大量的行。 我的探查器总是显示收集统计数据的函数是最慢的 (97%),尽管该程序做了很多其他事情。 首先,我使用了一个 HashMap 和如下代码:
occurances = new HashMap<>();
for (int symbol : line) {
Integer amount = 1;
if (occurances.containsKey(symbol)) {
amount += occurances.get(symbol);
}
occurances.put(symbol, amount);
}
分析器显示 hashMap.put 占用了 97% 的处理器使用率
然后我尝试用创建一次的 ArrayList 替换它: 并对其进行了一些优化(行总是长于 1 个字符),但它仍然很慢。
int symbol = line[0];
occurances.set(symbol, 1);
for (int i = 1; i < length; i++) {
symbol = line[i];
occurances.set(symbol, 1 + occurances.get(symbol));
}
如果有人有更好的想法如何以更好的性能解决此任务,我们将不胜感激。
最佳答案
按照建议here你可以尝试做类似的事情
List<Integer> line = //get line as a list;
Map<Integer, Long> intCount = line.parallelStream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
关于java - 在 Java 中收集符号出现的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813735/