You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java字典创建与更新方法及Discord机器人哈希表计数异常求助

问题解决与Java字典使用说明

核心问题修复

你当前的问题是Hashtable被定义在事件方法内部,每次onMessageReceived触发时都会新建一个空的Hashtable,之前的计数自然无法保留。只需要把Hashtable提升为类的成员变量,让它属于监听器实例而非单次方法调用:

public class botListeners extends ListenerAdapter {
    // 把Hashtable定义为类成员变量,全局唯一
    private final Hashtable<String, Integer> messangerDict = new Hashtable<>();

    @Override
    public void onMessageReceived(@NotNull MessageReceivedEvent event) {
        super.onMessageReceived(event);

        if (!event.getAuthor().isBot()) {
            String message = event.getMessage().getContentRaw();
            System.out.println("A message has been sent: " + message);
           
            String messenger = event.getAuthor().getAsTag();

            if (messangerDict.containsKey(messenger)){
                messangerDict.put(messenger, messangerDict.get(messenger) + 1);
            }else {
                messangerDict.put(messenger, 1);
            }

            System.out.println(messangerDict.toString());
        }
    }
}

修改后,每次收到消息都会复用同一个Hashtable,计数就能正常累加了。

Java字典(Map)的创建与更新方法

Java中没有直接叫「字典」的类,通常用Map接口的实现类来完成键值对存储,常见的有:

1. 创建方式

  • Hashtable:线程安全,但性能较低,不推荐在单线程场景使用
    Hashtable<String, Integer> hashtable = new Hashtable<>();
    
  • HashMap:非线程安全,性能高,是日常开发的首选
    HashMap<String, Integer> hashMap = new HashMap<>();
    
  • ConcurrentHashMap:线程安全且性能优于Hashtable,适合多线程并发场景
    ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
    

2. 更新计数的简洁写法

你原来的containsKey判断可以用更简洁的API替代:

  • 使用getOrDefault:如果键不存在,返回默认值0,直接累加
    messangerDict.put(messenger, messangerDict.getOrDefault(messenger, 0) + 1);
    
  • 使用compute方法:直接定义键的更新逻辑
    messangerDict.compute(messenger, (key, oldValue) -> oldValue == null ? 1 : oldValue + 1);
    
  • 使用merge方法:合并键值,不存在时用默认值1,存在时累加
    messangerDict.merge(messenger, 1, Integer::sum);
    

这些写法都能替代原来的if-else逻辑,让代码更简洁。

内容的提问来源于stack exchange,提问作者TomSmail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:30:24