如果密钥已存在,则增加映射的值?

时间:2015-02-27 06:40:12

标签: java dictionary

我有一张地图,其中我将总字节数存储为键并计为值。如果密钥已存在于我的地图中,我需要将计数增加1。如果密钥不存在,则从1开始。

我有以下代码 -

Map<Integer, Integer> userList = new HashMap<Integer, Integer>();
for (String userId : listOfUsers) {
        String sql = "select * from test_table where user_id='"+ userId + "';";
    try {
        SimpleStatement query = new SimpleStatement(sql);
        ResultSet res = session.execute(query);

        int totalBytes = 0;
        Iterator<Row> rows = res.iterator();
        while (rows.hasNext()) {
            Row r = rows.next();

            ByteBuffer client_value = r.getBytes("client_value");

            int returned = client_value.remaining();
            totalBytes = totalBytes + returned;
        }

        // does this look right?
        userList.put(totalBytes, userList.get(totalBytes) + 1);

    } catch (Exception e) {
        // log an error
    }
}

每当我第一次跑步时,我的userList.put命令就会获得NPE。我在做什么问题?这段代码将在单线程中。

4 个答案:

答案 0 :(得分:3)

不,如果密钥尚未出现,您将获得NullPointerException。这是因为表达式userList.get(totalBytes) + 1会尝试将null取消装箱到int

正确的方法是在添加前进行null检查。

Integer bytes = userList.get(totalBytes);
userList.put(totalBytes, bytes == null ? 1 : bytes + 1);

答案 1 :(得分:1)

没有

userList.put(totalBytes, userList.get(totalBytes) + 1);

第一次运行时,userList.get(totalBytes)将返回一个空对象,当然不能递增。

可以修复为

Integer val = userList.get(totalBytes);
if (val == null) {
   val = new Integer ();
}
val = val + 1;

答案 2 :(得分:0)

您可以更改

userList.put(totalBytes, userList.get(totalBytes) + 1);

userList.put(totalBytes, userList.getOrDefault(totalBytes, 0) + 1);

如果您正在使用Java 8,则无需进行手动空检查。

答案 3 :(得分:0)

请尝试以下方法..

userList.put(totalBytes,(userList.contains(totalBytes)?(userList.get(totalBytes)+1):1));