2013-07-10 58 views
0

所以我有一个来自SQL数据库的DAO对象列表。Java:如何合并对象排序

他们有以下领域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天......这是一个更大的程序的一小部分,这就是为什么我必须以设定的格式制作对象。

它主要是我卡上的语法,我无法找到一个方法来做到这一点,我有经历的每个对象

编辑此刻一个循环:我得提前

回答

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循环,所以可能这就是你在做它的方式!

+0

是的,这几乎是我如何做到的。我想不出一个整洁的方式,看起来我必须坚持下去!不过谢谢 – Lissy

1

在普通的SQL做到这一点在Java中

我会为任何建议或代码片段,谢谢非常感谢,你会使用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 
+0

不,我一直在使用SQL试过了,就是我的SQL查询已经是约30行,因为它从不同的表格获取所有这些信息。我找不到合并多行的方法 – Lissy

0

遍历生成的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 

     } 
    }