gpt4 book ai didi

java - 计算 Java 中 Map 中某个键的出现次数

转载 作者:搜寻专家 更新时间:2023-10-31 08:07:00 26 4
gpt4 key购买 nike

我正在编写一个项目,该项目从 .java 文件中捕获 Java 关键字并使用 map 跟踪出现的情况。我过去曾成功地使用过类似的方法,但我似乎无法将此方法用于我的预期用途。

    Map<String,Integer> map = new TreeMap<String,Integer>();
Set<String> keywordSet = new HashSet<String>(Arrays.asList(keywords));
Scanner input = new Scanner(file);
int counter = 0;
while (input.hasNext())
{
String key = input.next();
if (key.length() > 0)
{
if (keywordSet.contains(key))
{
map.put(key, 1);
counter++;
}

if(map.containsKey(key)) <--tried inner loop here, failed
{
int value = map.get(key);
value++;
map.put(key, value);
}

}

此代码块应该将关键字添加到键中,并在每次出现相同键时递增值。到目前为止,它添加了关键字,但未能正确增加值。这是一个示例输出:

{assert=2, class=2, continue=2, default=2, else=2, ...} 

基本上它会增加 map 中的每个值,而不是它应该增加的值。我不确定是我想多了还是什么。我尝试了一个内部循环,它给了我疯狂的结果。我真的希望我只是想多了。非常感谢任何帮助!

最佳答案

有一种更简洁(也更容易推理)的方法来实现你想要的:

final ConcurrentMap<String, AtomicInteger> map = new ConcurrentHashMap<>();
final Scanner input = new Scanner(file);
while (input.hasNext()) {
final String key = input.next();
if (key.length() > 0) {
map.putIfAbsent(key, new AtomicInteger(0));
map.get(key).incrementAndGet();
}
}

让我们分析一下为什么这样做。

每当 Scanner 遇到关键字时,有两种可能的情况:您以前遇到过它(即,它是一个已知关键字),或者它是一个还看不见的关键字

  • 如果是不可见的关键字:putIfAbsent将放一个 AtomicInteger在映射中的值为 0,incrementAndGet() 之后会将其设置为 1,并且从现在开始,它成为一个已知关键字
  • 如果它是一个已知关键字:putIfAbsent 什么都不做,incrementAndGet()将增加 map 中已经存在的值。

然后,如果您想要 key 集,您可以:

final Set<String> keys = map.keySet();

要打印所有值,您可以执行以下操作:

for (final String k : map.keySet()) {
System.out.println(k + ": " + map.get(k).get());
}

您没有被迫使用我上面使用的两个“不同”类,ConcurrentMapAtomicInteger。使用它们更容易,因为它们封装了您尝试自己编写(但失败了)的大部分逻辑。它们封装的逻辑正是所有其他答案所描述的(即,测试值是否存在,如果不将其设置为 0,则获取存在的任何值,递增它并将其放回 map 中)。

要按字母顺序维护 map 的键(我们正在计算的单词),请使用 ConcurrentNavigableMap例如ConcurrentSkipListMap .

关于java - 计算 Java 中 Map 中某个键的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15217438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com