根据 java 中的属性对对象列表进行分组

groupping list of objects based on properties in java

我有 POJO List<TravelRequestDTO>,我想分组并创建过滤 List<TravelRequestDTO> 如果 leavingFrom,goingTo,onwarDate,returnDate 相同,则将乘客添加到同一对象

示例:

Passanger,     onWard,      return,      leavingFrom,     goingTo

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

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

最终 List<TravelRequestDTO> 应包含:

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

您可以使用以下代码获取基于属性的 TravelRequestDTO 对象列表。

Function<TravelRequestDTO, List<Object>> compositeKey = travelRecord ->
    Arrays.<Object>asList(travelRecord.getOnWard(),travelRecord.getReturn(),travelRecord.getLeavingFrom(),travelRecord.getGoingTo());

Map<Object, List<TravelRequestDTO>> map =
people.collect(Collectors.groupingBy(compositeKey, Collectors.toList()));

,你可以这样做:

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

检查 this question 其他解决方案。

这只是你想要的一半。之后,您必须从此地图中提取最终结果。或者您可以一步完成:

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