我想对属于HashMap<String, Integer>
的{{1}}进行一些操作。但是我收到了以下错误:操作++ / - 的参数无效时执行ArrayList<HashMap<String, Integer>>
如下:
logEntry.get(key) ++
然后,我必须将代码更改为以下代码,并且它可以工作:
....
Integer tempSize = ...;
List<HashMap<String, Integer>> tokenCollection = new ArrayList<>(tempSize);
while(tokenCollection.size() < tempSize) {
tokenCollection.add(new HashMap<String, Integer>());
}
....
for (int i = 0; i < tempSize; i++) {
String key = ...;
HashMap<String, Integer> logEntry = tokenCollection.get(i);
if (logEntry.containsKey(key)) {
logEntry.get(key) ++; // ERROR
} else {
logEntry.put(key, 1);
}
}
但这增加了许多额外的操作。我可以避免这个吗?另外,我认为我这样做的方式过于复杂或愚蠢,有没有更简单的方法?
答案 0 :(得分:4)
正如其他答案已经说明的那样,你不能直接改变密钥。 但您可以进一步缩短代码:
logEntry.put(key, logEntry.containsKey(key) ? logEntry.get(key) + 1 : 1);
答案 1 :(得分:3)
您无法改变已存储在Integer
中的Map
给定密钥的值,因为Integer
是不可变类型。
但是,您可以缩短代码:
if (logEntry.containsKey(key)) {
logEntry.put(key, logEntry.get(key) + 1);
} else {
logEntry.put(key, 1);
}
在使用新值放入相同的密钥之前,无需从地图中删除密钥。
您可以增加值并将新值放在地图中的同一个语句中。
另一个选项(取消对containsKey
的调用):
Integer value = logEntry.get(key);
logEntry.put (key, value != null ? value + 1 : 1);
答案 2 :(得分:3)
您可以将代码缩短为
if (logEntry.containsKey(key)) {
logEntry.put(key, logEntry.get(key) + 1);
} else {
logEntry.put(key, 1);
}
至少删除了显式删除。
遗憾的是,Java没有语言语法使您能够通过引用检索元素(这将允许增加通过引用),就像在C ++中一样。
答案 3 :(得分:1)
为什么map.get(key)++不能编译但是Integer i = 1; i ++有效:
https://bukkit.org/threads/invalid-argument-to-operation.336350/
递增和递减运算符仅适用于变量,而不是值。