Java:如何合并对象排序

时间:2013-07-10 08:54:37

标签: java dao

所以我有一个来自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中执行此操作

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

3 个答案:

答案 0 :(得分: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循环了,所以这可能就是你这样做的方式!!

答案 1 :(得分: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

答案 2 :(得分:0)

迭代生成的DAO。保留一个键为petId的Map(我认为这是唯一的),值为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 

        }  
    }