2013-07-10 65 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 

     } 
    }