简体   繁体   中英

Java: How to merge objects sort of

so I've got a List of DAO objects that have come strait from an SQL database.

They have the following fields petId, petWeight, petAge, drugCode, drugStrength, dayOfTreatment.

And I need to put it into another object that will have one object for each pet (the only difference will be multiple days in one object, will be a list)

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

Convert to:

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

In the data above is is simplified a little bit, there are a few more fields, and the days of treatment may not always be consecutive days, eg day 0,3,6,9 or day 0,7,14... And this is a small part of a much bigger program, that's why I have to make the objects in a set format.

It's mainly the syntax I'm stuck on, I just can't find a way to do this, I have a loop at the moment going through each of the objects

Edit: I've got to do this in Java

I'd be very grateful for any suggestions or code snippets, thanks in advance

A crude way of doing this can be like this.

    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());
        }
    }

But as you mentioned you are already using for loop, so might be this is the way you are doing it !!

In plain SQL, you would use group by petId, petWeight, petAge, drugCode, drugStrength . The main challenge would be how to generate the daysOfTreatment column. As far as I know, there is no standard SQL construct to do that, but some database vendors have specific functions that allow you to do that.

For example, in MySQL, you could use GROUP_CONCAT like this:

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

While iterating through the resultant DAOs. Keep a Map whose key is petId(I presume this is unique) and the value is the Pet object.

So the class Pet might look like

    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          
    } 

So here is the pseudo code

    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 

        }  
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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