【问题标题】:List with object Total of same id in Java [duplicate]Java中具有相同ID的对象总数的列表[重复]
【发布时间】:2020-04-14 03:33:30
【问题描述】:
List<Item> list= new ArrayList<Item>();
list.add(new Item("a", 1));
list.add(new Item("b", 2));
list.add(new Item("a", 3));
list.add(new Item("c", 10));
list.add(new Item("c", 50));

结果

Sum of a = 4;
Sum of b = 2;
Sum of c = 60;

在这个例子中如何合计相同的键,我尝试了很多次但无法合计,所以请帮我解决这个问题。

【问题讨论】:

  • 您不能拥有具有相同键的地图。在这种情况下,键“a”的值为 3,键“c”的值为 50。当您对同一键执行两次 put 时,第二次将重写该值。这就是为什么你不能这样做。
  • 您可能正在寻找的数据结构是Map&lt;String, List&lt;Integer&gt;&gt;

标签: java


【解决方案1】:

Map 保持键的唯一性,即当您尝试使用现有键添加元素时,旧值将被新值替换。您可以通过下面给出的示例来理解它:

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> m1 = new HashMap<>();
        m1.put("a", 1);
        m1.put("b", 2);
        m1.put("a", 3);
        m1.put("c", 10);
        m1.put("c", 50);
        System.out.println(m1);
    }
}

输出:

{a=3, b=2, c=50}

如您所见,3 已替换 1,因为它已使用相同的密钥 a 放入密钥中。

如果您需要保持 3 和 1 具有相同的键/ID,您可以实现您的自定义类型,例如:

class Item {
    private String id;
    private int val;
    //Constructors, getters and setters 
}

然后,将Item 的实例添加到List 例如

List<Item> list = new ArrayList<Item>();
list.add(new Item("a", 1));
list.add(new Item("b", 2));
list.add(new Item("a", 3));
list.add(new Item("c", 10));
list.add(new Item("c", 50));

最后,您可以将id上的项目分组并计算总和如下:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class Item {
    private String id;
    private int val;

    public Item(String id, int val) {
        this.id = id;
        this.val = val;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return "Item [id=" + id + ", val=" + val + "]";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Item> list = new ArrayList<Item>();
        list.add(new Item("a", 1));
        list.add(new Item("b", 2));
        list.add(new Item("a", 3));
        list.add(new Item("c", 10));
        list.add(new Item("c", 50));

        list.stream().collect(Collectors.groupingBy(item -> item.getId(), Collectors.summingInt(item -> item.getVal())))
                .forEach((id, sumVal) -> System.out.println("Sum of " + id + " = " + sumVal));
    }
}

输出:

Sum of a = 4
Sum of b = 2
Sum of c = 60

【讨论】:

  • 你是对的先生,非常感谢您分享有关地图的知识非常感谢。
  • @atomandroid - 不客气。
  • 你在哪里写 list.strem().collect 在android中不起作用
  • 我已经发布了一个经过测试的代码。您需要导入java.util.stream.Collectors。如果有任何进一步的疑问/问题,请随时发表评论。
  • 我导入但不支持 lambda 表达式
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多