当前位置: 首页 > 知识库问答 >
问题:

如果列表中元素的变量重复,则在其他变量上添加值

储修谨
2023-03-14

我的列表由变量类型(字符串),金额(双精度)和数量(整数)组成,它看起来像这样:

Type: Type A, Amount : 55.0, Quantity : 0
Type: Type A, Amount : 55.0, Quantity : 5
Type: Type A, Amount : 44.35, Quantity : 6
Type: Type A, Amount : 55.0, Quantity : 0
Type: Type B, Amount : 7.0, Quantity : 1
Type: Type B, Amount : 7.0, Quantity : 1
Type: Type C, Amount : 1613.57, Quantity : 0
Type: Type C, Amount : 1613.57, Quantity : 1

所以我试图循环我的数组来寻找重复的,如果是重复的,就加上数量。结果会是这样的:

Type: Type A, Amount : 209.35.0, Quantity : 11
Type: Type B, Amount : 14.0, Quantity : 2
Type: Type C, Amount : 3227.14, Quantity : 1

我尝试过创建另一个列表,将列表添加到新列表中,然后比较它们,但没有成功

List<Type> newList = new ArrayList();
        for(int k = 0; k < typeList.size(); k++) {
            Type type= new Type();
            Double totalAmount = Double.parseDouble("0");
            type.setTypeName(typeList.get(k).getTypeName());
            type.setAmount(chargeTypeList.get(k).getAmount());
            newList.add(k, type);
            if(typeList.get(k).getChargeTypeName().equalsIgnoreCase(newList.get(k).getiTypeName())) {
                totalAmount += typeList.get(k).getAmount();
            }
        }

我不希望对值进行硬编码以检查重复类型

共有1个答案

柯栋
2023-03-14

您可能应该将这些值放入Map中,它保证每个键只有一个元素。使用map是非常常见的,用于表示一些东西的数量,我们将这些东西存储为键,并跟踪我们在键中拥有多少这些东西。

然后可以使用计算将元素添加到列表中。

您目前拥有的:

record Data(String type, Double amount, Integer quantity) {}

什么可以更好地代表您的数据:

record Datav2(Double amount, Integer quantity) {}

将Datav2存储在地图中并添加元素。

var map = new HashMap<>(Map.of("A", new Datav2( 2.0, 3)));
        
// add element to map equivalent to Data("A", 3.0, 3)
map.compute("A", (k, v) -> {
    if (v == null) {
        v = new Datav2(0.0, 0); 
    }
    return new Datav2(v.amount + 3.0, v.quantity + 3);
});

如果出于任何原因需要从列表开始,可以使用 API 将列表转换为映射。

var list = List.of(new Data("A", 2.0, 3),
       new Data("A", 3.0, 3),
       new Data("C", 2.0, 1),
       new Data("B", 10.0, 3),
       new Data("B", 2.0, 5)
);

var collected = list
         .stream()
         .collect(Collectors.toMap(
                       // what will the key be
                       Data::type,
                       // what will the value be
                       data -> new Datav2(data.amount, data.quantity),
                       // how do we combine two values if they have the same key
                       (d1, d2) -> new Datav2(d1.amount + d2.amount, d1.quantity + d2.quantity)
         ));
System.out.println(collected);

{A=Datav2[amount=5.0, quantity=6], B=Datav2[amount=12.0, quantity=8], C=Datav2[amount=2.0, quantity=1]}

 类似资料:
  • 我正在学习JAVA。如果我想在列表中添加一些变量。我知道的是这样的: 如果我有很多变量呢。例如,从a到z,我是否需要像这样手动添加它? 因为我声明了100个变量,需要将它们添加到列表中。我们有其他方法可以更聪明地添加它们吗?Eclipse或Intellij中有热键吗? 感谢您的帮助。

  • 我试图在玩家发牌后从套牌中拿走一张牌,这样那些牌就不会再发牌了。 但这是我的命令错误:

  • 问题内容: 因此,这是我要在python中执行的操作的抽象代码。 在这里,当我清除dict_时,显然list_中的所有元素都被删除,因为它们只是地址映射到变量dict_。 我想要的是复制dict_的实例,以便可以将其存储在list_中。 有人可以解释一下在每个循环中将获取的字典存储到list_中的方法吗?提前致谢。 问题答案: 您正在将对字典的引用添加到列表中,然后清除字典 本身 。这将删除字典的

  • 以下是经典的实践中的一致性: 当线程A写入一个易失性变量,随后线程B读取相同的变量时,A在写入易失性变量之前可见的所有变量的值在读取易失性变量后变得对B可见。 我不确定我真的能理解这句话。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用对使用非volatile变量也有副作用<在我看来,这句话有一些我无法理解的微妙含义<有什么帮助吗?

  • 问题内容: 我想要一段代码,如果它不存在,则在范围内创建一个变量,如果它已经存在,则访问该变量。我需要它是 相同的 代码,因为它将被多次调用。 但是,Tensorflow需要我指定是要创建还是重用该变量,如下所示: 我怎样才能弄清楚是自动创建还是重用它?即,我希望以上两个代码块 相同, 并运行程序。 问题答案: 创建新变量且未声明形状时,或在变量创建过程中违反重用时,将引发A。因此,您可以尝试以下

  • 问题内容: 以下是经典文章Concurency in Practice: 当线程A写入易失性变量,随后线程B读取相同的变量时,在写入易失性变量之前A可见的所有变量的值,在读取易失性变量后B可见。 我不确定我是否真的能理解这一说法。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用volatile还会对非易失性变量的使用产生副作用? 在我看来,该声明具有我无法理解的一些微妙含义。 有什么帮助