繁体   English   中英

Java:如何合并对象

[英]Java: How to merge objects sort of

所以我有一个来自SQL数据库的DAO对象列表。

它们具有以下字段petId,petWeight,petAge,drugCode,drugStrength和dayOfTreatment。

我需要把它放到另一个对象中,每个宠物都会有一个对象(唯一的不同是一个对象需要多天,这是一个列表)

petId | petWeight | petAge | drugCode | drugStrength | dayOfTreatment
 01     5kg         2years   XCJJL      20mg           0
 01     5kg         2years   XCJJL      20mg           1
 01     5kg         2years   XCJJL      20mg           2
 01     5kg         2years   XCJJL      20mg           3
 02     9kg         6years   XUKKG      80mg           0
 02     9kg         6years   XUKKG      80mg           1
 02     9kg         6years   XUKKG      80mg           2
 02     9kg         6years   XUKKG      80mg           3
 02     9kg         6years   XUKKG      80mg           4
 03     7kg         4years   XDDDD      120mg          0

转换成:

petId | petWeight | petAge | drugCode | drugStrength | daysOfTreatment
01      5kg         2years   XCJJL      20mg           0,1,2,3
02      9kg         6years   XUKKG      80mg           0,1,2,3,4
03      7kg         4years   XDDDD      120mg          0

在上面的数据中,该数据被简化了一些,还有更多字段,并且治疗的日期可能并不总是连续的,例如,第0,3,6,9天或第0,7,14天...这只是更大程序的一小部分,这就是为什么我必须将对象设置为固定格式。

这主要是我所坚持的语法,我只是找不到一种方法,现在遍历每个对象时都有一个循环

编辑:我必须在Java中执行此操作

我非常感谢您的任何建议或代码段,在此先感谢

粗略的方法可以像这样。

    HashMap<String, petObject> petObjMap = new HashMap<String, petObject>();
    for(PetObject petObject : petObjectList){

        String id = petObject.getId();
        PetObject groupedObj = petObjMap.get(id);
        if( groupedObj == null ){
            petObjMap.put(id, petObject);
        }else{
            groupedObj.setDayOfTreatment(groupedObj.getDayOfTreatment + "," + petObject.getDayOfTreatment());
        }
    }

但是正如您提到的那样,您已经在使用for循环,所以这可能就是您这样做的方式!

在普通SQL中,您将使用group by petId, petWeight, petAge, drugCode, drugStrength 主要的挑战是如何生成daysOfTreatment列。 据我所知,没有标准的SQL构造可以执行此操作,但是某些数据库供应商具有允许您执行此操作的特定功能。

例如,在MySQL中,您可以这样使用GROUP_CONCAT

select petId,
       petWeight,
       petAge,
       drugCode,
       drugStrength,
       group_concat(dayOfTreatment separator ',')
from   <table name>
group by
       petId,
       petWeight,
       petAge,
       drugCode,
       drugStrength

在迭代生成的DAO时。 保留一个映射,其键为petId(我想这是唯一的),其值为Pet对象。

所以宠物课可能看起来像

    class Pet {
        int petId;
        int petWeightKg; //in kg
        Map<String, PetDosage> dosage; //drugCode to PetDosage

        //other getters and setters  

    } 

    class PetDosage {

        int drugStrengthMg ;//mg
        List<Integer> daysOfTreatment;

        //other getters and setters          
    } 

所以这是伪代码

    Map<Integer, Pet> petIdToPet = ...
    for (PetDAO petDAO : listPetDAOs) {
        int id = petDAO.getId();
        Pet pet = petIdToPet.get(id);
        if (pet == null) { //woo new pet
            petIdToPet.put(id, new Pet( .... ));
        } else {
            //Depending upon the other data
           // update fields like dosage, days
           //increment drugStrength, 
           //Add List of Days etc 

        }  
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM