【问题标题】:Invalid argument to operation ++/--操作参数无效 ++/--
【发布时间】:2016-06-08 00:45:11
【问题描述】:

我想对属于ArrayList<HashMap<String, Integer>>HashMap<String, Integer> 做一些操作。但我得到了以下错误:Invalid argument to operation ++/-- when doing ths logEntry.get(key) ++ as below:

....
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);
    }
}

然后,我必须将代码更改为以下代码,它可以工作:

    if (logEntry.containsKey(key)) {
      Integer tempValue = logEntry.get(key);
      tempValue++;
      logEntry.remove(key);
      logEntry.put(key, tempValue);
    } else {
      logEntry.put(key, 1);
    }

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

【问题讨论】:

标签: java arrays list arraylist hashmap


【解决方案1】:

对于给定的键,您不能改变已存储在 Map 中的 Integer 的值,因为 Integer 是不可变类型。

但是,您可以缩短代码:

if (logEntry.containsKey(key)) {
  logEntry.put(key, logEntry.get(key) + 1);
} else {
  logEntry.put(key, 1);
}
  1. 在为同一个键添加新值之前,无需从映射中删除键。

  2. 您可以在同一语句中递增值并将新值放入映射中。

另一个选项(消除对containsKey 的调用):

Integer value = logEntry.get(key);
logEntry.put (key, value != null ? value + 1 : 1);

【讨论】:

  • 终于有人提到Integer 是不可变的! :-)
  • 尽我所能,让我们的宇宙成为一个美好的地方:-)
【解决方案2】:

您可以将代码缩短为

if (logEntry.containsKey(key)) {
    logEntry.put(key, logEntry.get(key) + 1);
} else {
    logEntry.put(key, 1);
}

这至少消除了显式删除。

不幸的是,Java 没有语言语法让您能够通过引用 检索元素(这将允许通过引用进行递增),就像在 C++ 中一样。

【讨论】:

    【解决方案3】:

    正如其他答案已经说明的那样,您不能直接改变密钥。 但是您可以进一步缩短代码:

    logEntry.put(key, logEntry.containsKey(key) ? logEntry.get(key) + 1 : 1);
    

    【讨论】:

      【解决方案4】:

      为什么 map.get(key)++ 不能编译但是 Integer i =1; i++ 有效:

      https://bukkit.org/threads/invalid-argument-to-operation.336350/

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-08
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 2014-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        相关资源
        最近更新 更多