第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據(jù)特定字段從列表中刪除重復的對象,但在刪除之前添加數(shù)量?

如何根據(jù)特定字段從列表中刪除重復的對象,但在刪除之前添加數(shù)量?

回首憶惘然 2023-08-23 15:02:40
我有一個具有多個字段的程序集類。我需要根據(jù)程序集代碼從程序集對象列表中刪除程序集類的重復對象,但在刪除之前,我需要將程序集數(shù)量添加到匹配的程序集對象的數(shù)量中。package com.company;import java.util.ArrayList;import java.util.HashSet;import java.util.List;public class Main {    public static void main(String[] args) {        List<Assembly> assemblies = new ArrayList<>();        assemblies.add(new Assembly("abc1", 3.0));        assemblies.add(new Assembly("abc2", 6.0));        assemblies.add(new Assembly("abc3", 8.4));        assemblies.add(new Assembly("abc4", 9.0));        assemblies.add(new Assembly("abc1", 4.2));        assemblies.add(new Assembly("abc1", 6.3));        System.out.println("List with duplicates: "+assemblies);        HashSet<String> assmCode=new HashSet<>();        assemblies.removeIf(e->!assmCode.add(e.getAssemblyCode())); //remove the last two abc1        //but i need to add 4.2, 6.3 to 3.0 before removing        System.out.println("List without duplicates: "+assemblies);    }}class Assembly{    private String assemblyCode;    private double assemblyQty;    //There will be more such fields    public Assembly(String assemblyCode, double assemblyQty) {        this.assemblyCode = assemblyCode;        this.assemblyQty = assemblyQty;    }    public String getAssemblyCode() {        return assemblyCode;    }請讓我知道我是否可以在刪除重復對象之前執(zhí)行此類操作。我對 java 的集合 api 很陌生,很抱歉問這個問題解決方案是否簡單。只是為了澄清一下,輸出必須是這樣的:包含重復項的列表: [Assembly{assembleCode='abc1', assemblyQty=3.0}, Assembly{ assemblyCode='abc2', assemblyQty=6.0}, Assembly{ assemblyCode='abc3', assemblyQty=8.4}, Assembly{ assemblyCode='abc4 ', assemblyQty=9.0}, Assembly{ assemblyCode='abc1', assemblyQty=4.2}, Assembly{ assemblyCode='abc1', assemblyQty=6.3}]沒有重復項的列表:[Assembly{assembleCode='abc1', assemblyQty=13.5}, Assembly{ assemblyCode='abc2', assemblyQty=6.0}, Assembly{ assemblyCode='abc3', assemblyQty=8.4}, Assembly{ assemblyCode='abc4 ', 裝配數(shù)量=9.0}]
查看完整描述

1 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

我需要根據(jù)程序集代碼從程序集對象列表中刪除程序集類的重復對象,但在刪除之前,我需要將程序集數(shù)量添加到匹配的程序集對象的數(shù)量中。


您需要保留重復值才能重用它們。

removeIf()不會捕獲此信息。


您可以使用迭代器刪除元素并引入 Map 變量來存儲重復信息:


Map<String, Double> assemblyDupMap = new HashMap<>();

for (Iterator<Assembly> it = assemblies.iterator(); it.hasNext(); ){

      Assembly a = it.next();

      if(!assmCode.add(a.getAssemblyCode())){ 

         // store the duplicate information 

         double currentQty = assemblyDupMap.getOrDefault(a.getAssemblyCode(), 0D);

         assemblyDupMap.put(a.getAssemblyCode(), currentQty + a.getAssemblyQty()); 

         // remove it from the list

         it.remove();        

      }


};

然后更新數(shù)量:


assemblies.forEach( a -> Optional.ofNullable(assemblyDupMap.get(a.getAssemblyCode()))

                                 .ifPresent(qty -> a.incrementQty(qty))

                  );

正如您所注意到的,它已經足夠冗長了。本質上是因為我們需要更新列表的元素。

如果創(chuàng)建新列表而不是使用現(xiàn)有列表是可以接受的,那么流方法會更簡潔。


按 Map 中的匯編代碼對對象進行分組,按代碼求和它們的數(shù)量,并僅保留對象作為結果:


new ArrayList<>(assemblies.stream()

                          .collect(toMap(Assembly::getAssemblyCode, o -> o,

                                         (a, b) -> new Assembly(a.getAssemblyCode(),

                                                                a.getAssemblyQty() + b

                                                                    .getAssemblyQty()),

                                         LinkedHashMap::new)

                          )

                          .values());

根據(jù)記錄,對doubles 求和可能會產生“不良”結果。BigDecimal您可能感興趣。


查看完整回答
反對 回復 2023-08-23
  • 1 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號