0

所以我有一个来自 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 中做到这一点

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

4

3 回答 3

3

这样做的粗略方法可能是这样的。

    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循环,所以可能这就是您正在使用的方式!

于 2013-07-10T09:10:45.690 回答
1

在纯 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
于 2013-07-10T09:02:28.923 回答
0

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

所以 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 

        }  
    }
于 2013-07-10T09:24:27.457 回答