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
相关产品推荐
相关产品推荐

