如何在同一密钥HashMap Java中求和值?

如何在同一密钥HashMap Java中求和值?,java,hashmap,Java,Hashmap,我需要对同一个键中的值求和,而不仅仅是替换?谢谢 LinkedHashMap<String, LinkedHashMap<String, Integer>> users = new LinkedHashMap<>(); for (int i = 0; i < n; i++) { String[] input = scanner.readLine().split("\\s+"); String ip = in

我需要对同一个键中的值求和,而不仅仅是替换?谢谢

    LinkedHashMap<String, LinkedHashMap<String, Integer>> users = new LinkedHashMap<>();
    for (int i = 0; i < n; i++) {
        String[] input = scanner.readLine().split("\\s+");
        String ip = input[0];
        String name = input[1];
        int duration = Integer.parseInt(input[2]);
        if (!users.containsKey(name)) {
            users.put(name, new LinkedHashMap<>());
            users.get(name).put(ip,duration);
        } else {
            users.get(name).put(ip,duration);
        }
    }

我相信这是你的答案 试试这个:

for (int i = 0; i < n; i++) {
        String[] input = scanner.readLine().split("\\s+");
        String ip = input[0];
        String name = input[1];
        int duration = Integer.parseInt(input[2]);
        if (!users.containsKey(name)) {
            users.put(name, new LinkedHashMap<>());
            users.get(name).put(ip, duration);
        } else {
            LinkedHashMap<String, Integer> user = users.get(name);
            Integer userDuration = user.get(ip);
            user.put(ip, userDuration + duration);
        }
    }

我相信这是你的答案 试试这个:

for (int i = 0; i < n; i++) {
        String[] input = scanner.readLine().split("\\s+");
        String ip = input[0];
        String name = input[1];
        int duration = Integer.parseInt(input[2]);
        if (!users.containsKey(name)) {
            users.put(name, new LinkedHashMap<>());
            users.get(name).put(ip, duration);
        } else {
            LinkedHashMap<String, Integer> user = users.get(name);
            Integer userDuration = user.get(ip);
            user.put(ip, userDuration + duration);
        }
    }

不幸的是,由于我从手机输入,我无法添加完整的代码段,但我相信,如果您以后需要初始映射,我只需使用“流”和“合并”来收集,或者如果您不需要,我只需将其合并即可。

不幸的是,由于我从手机输入,我无法添加完整的代码段,但我相信,如果您以后需要初始贴图,您只需使用“流”和“合并”进行收集,或者如果您不需要,只需“合并”而不是“放置”,您可以在外部贴图中使用,也可以在内部贴图中使用:

Map<String, Map<String, Integer>> users = new LinkedHashMap<>();

for (int i = 0; i < n; i++) {
    String[] input = scanner.readLine().split("\\s+");
    String ip = input[0];
    String name = input[1];
    int duration = Integer.parseInt(input[2]);

    users.computeIfAbsent(name, k -> new LinkedHashMap<>())
        .merge(ip, duration, Integer::sum);
}
您可以在外部贴图中使用,也可以在内部贴图中使用:

Map<String, Map<String, Integer>> users = new LinkedHashMap<>();

for (int i = 0; i < n; i++) {
    String[] input = scanner.readLine().split("\\s+");
    String ip = input[0];
    String name = input[1];
    int duration = Integer.parseInt(input[2]);

    users.computeIfAbsent(name, k -> new LinkedHashMap<>())
        .merge(ip, duration, Integer::sum);
}

使用一个映射,其中您的类具有名称、ip和累积持续时间。将addDurationint duration方法添加到类中,以将持续时间添加到累积的持续时间中。Java是一种面向对象语言。使用类。这也会使你的代码更清晰、更快。谢谢你的建议,但目的是解决没有类的问题,我正在尝试:使用一个地图,在地图上你的类有一个名称、一个ip和一个累积的持续时间。将addDurationint duration方法添加到类中,以将持续时间添加到累积的持续时间中。Java是一种面向对象语言。使用类。这将使您的代码更加清晰和快速,谢谢你的建议,但目的是解决没有类的问题,我正在尝试:不确定这里的设置,但如果有相同的名称和不同的ip,这将抛出一个空点Yes you's right thread main java.lang.NullPointerException中的异常我有一个以上的答案,在这种情况下应该对你有用不确定设置这里,但如果有相同的名称和不同的ip,这将抛出一个空点Yes you is right thread main java.lang.NullPointerException中的异常我有一个以上的答案,在这种情况下应该对你有用你是上帝,我正等着这个答案。简单地说,我想通过名称而不是IP来求和,因为一个用户可以通过不同的IP进行计算。非常感谢!你是上帝,我正等着这个答案。简单地说,我想通过名称而不是IP来求和,因为一个用户可以通过不同的IP进行计算。非常感谢!