操作的参数无效++ / -

时间:2016-02-25 10:00:07

标签: java arrays list arraylist hashmap

我想对属于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);
    }
}

但这增加了许多额外的操作。我可以避免这个吗?另外,我认为我这样做的方式过于复杂或愚蠢,有没有更简单的方法?

4 个答案:

答案 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);
}
  1. 在使用新值放入相同的密钥之前,无需从地图中删除密钥。

  2. 您可以增加值并将新值放在地图中的同一个语句中。

  3. 另一个选项(取消对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/

递增和递减运算符仅适用于变量,而不是值。

  • 就像1 ++不能编译一样