Spring Boot 在Java中基于不同对象中的id高效地合并数据

ru9i0ody  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(199)

我有几个对象在一个表对象标识符,我想合并这3个对象的标识符牢记,所有对象的所有标识符应该在那里的最终表。
虽然我可以从对象1中得到所有的id,然后在其他对象中搜索并添加它,但我认为一定有更聪明的方法来做这件事。
数据@数据@NoArgsConstructor @AllArgsConstructor @生成器公共类数据{ int id ;利息金额1;利息额2;利息额3;

}
            
            Data data1 = new Data(7001,20,20,10);
            Data data2 = new Data(8002,30,30,10);
            Data data3 = new Data(7003,30,40,10);
            
            List ls = new ArrayLisy();
            ls.add(data1);
            ls.add(data2);
            ls.add(data3);
            
            Map<String,List<Data>> localMap = new HashMap();
            localMap.put("sheet1",ls);

类似地,我们有sheet 2和sheet 3,它们的id相同或有些不同,如

Data data1 = new Data(7001,5,0,2);
            Data data2 = new Data(8004,2,2,2);
            Data data3 = new Data(7003,3,4,5);
            
            List ls = new ArrayLisy();
            ls.add(data1);
            ls.add(data2);
            ls.add(data3);
            
            Map<String,List<Data>> localMap = new HashMap();
            localMap.put("sheet2",ls);

现在,我只是想合并工作表,使一个工作表的字段总和为
最终工作表data sheetFinal应包含一个数据列表,如其中id 7001具有从所有工作表(20+5)为amount 1添加的amount 1。

Data data1 = new Data(7001,25,20,12) ;
            Data data2 = new Data(8002,30,30,10) ;
            Data data3 = new Data(8004,2,2,2) ;
            Data data4 = new Data(7003,33,44,20) ;

我怎样才能合并工作表的ID,并得到一个最后的工作表与所有的数据在一个更聪明和内存效率的方式?谢谢

r1zhe5dt

r1zhe5dt1#

如果它是在Data类中定义的,我们可能会丢失static以及所有的getter和setter。

public static List<Data> sum(Map<String, List<Data>> localMap) {
    Map<Integer,Data> indexedAccumulator = new HashMap<>(); // indexed on Data.id
    for(List<Data> localMapEntry: localMap.values()) {
        for(Data data : localMapEntry) {
            int id = data.getId();
            if(indexedAccumulator.containsKey(id)) {
                Data sumData = indexedAccumulator.get(id);
                sumData.setAmount1(sumData.getAmount1() + data.getAmount1());
                sumData.setAmount2(sumData.getAmount2() + data.getAmount2());
                sumData.setAmount3(sumData.getAmount3() + data.getAmount3());
                
            } else {
                indexedAccumulator.put(id, new Data(id, data.getAmount1(), data.getAmount2(), data.getAmount3())); // new object to preserve original
            }
        }
        
    }

    List<Data> sheetFinal = new ArrayList<>();
    for (Data summedData : indexedAccumulator.values()) {
        sheetFinal.add(summedData);
    }
    
    return sheetFinal;
}

相关问题