Search code examples
javalistcollectionspojo

groupping list of objects based on properties in java


I have POJO List<TravelRequestDTO> and I want to group and create filtered List<TravelRequestDTO> if leavingFrom,goingTo,onwarDate,returnDate are same add passenger to same object

Example :

Passanger,     onWard,      return,      leavingFrom,     goingTo

  A,            1-2-20,      3-2-20,        BLR,            PUNE

  B,            1-2-20 ,     3-2-20,        BLR,            PUNE

final List<TravelRequestDTO> should contain :

Passanger,     onWard,      return,      leavingFrom,     goingTo

  A,B          1-2-20      3-2-20        BLR            PUNE
public class TravelRequestDTO {

    private List<Pax> passangers; 
    private String leavingFrom;
    private String goingTo;
    private String onwarDate;
    private String onwardTime;
    private String returnDate;
    private String returnTime;
    private SegmentTypeEnum segmentType;
    private TravelModeEnum travelMode;
    private String purposeOfVisit;
     }


    public class Pax{

    private String name;
    private String age;
    private String mobile;
    }

Solution

  • If you need older java version, than you can do like this:

    Map<Object, List<TravelRequestDTO>> hashMap = new HashMap<Object, List<TravelRequestDTO>>();
    for (TravelRequestDTO value: initList) {
        List<Object> key = Arrays.asList(value.getOnWard(),value.getReturn(),value.getLeavingFrom(),value.getGoingTo());
        if (!hashMap.containsKey(key)) {
            List<TravelRequestDTO> list = new ArrayList<TravelRequestDTO>();
            list.add(value);
            hashMap.put(key, list);
        } else {
            hashMap.get(key).add(value);
        }
    }
    

    Check this question for other solution.

    It is only half way to what you want. After that you have to extract final result from this map. Or you can do it in one step:

    Map<Object, TravelRequestDTO> hashMap = new HashMap<Object, TravelRequestDTO>();
    for (TravelRequestDTO value: initList) {
        List<Object> key = Arrays.asList(value.getOnWard(),value.getReturn(),value.getLeavingFrom(),value.getGoingTo());
        if (!hashMap.containsKey(key)) {
            TravelRequestDTO item = value; // pass first value or copy it to new
            hashMap.put(key, item);
        } else {
            hashMap.get(key).getPassangers().addAll(value.getPassangers());
        }
    }
    List<TravelRequestDTO> result = new ArrayList<>(hashMap.values());