Java 将对象值列表转换为组

Java 将对象值列表转换为组,java,list,Java,List,我有下面的代码 OrderCriteria o1 = new OrderCriteria(1, 1, 101, 201); OrderCriteria o2 = new OrderCriteria(1, 1, 102, 202); OrderCriteria o4 = new OrderCriteria(1, 1, 102, 201); OrderCriteria o5 = new OrderCriteria(2, 2, 501, 601); OrderCriteria o6 = new Ord

我有下面的代码

OrderCriteria o1 = new OrderCriteria(1, 1, 101, 201);
OrderCriteria o2 = new OrderCriteria(1, 1, 102, 202);
OrderCriteria o4 = new OrderCriteria(1, 1, 102, 201);
OrderCriteria o5 = new OrderCriteria(2, 2, 501, 601);
OrderCriteria o6 = new OrderCriteria(2, 2, 501, 602);
OrderCriteria o7 = new OrderCriteria(2, 2, 502, 601);
OrderCriteria o8 = new OrderCriteria(2, 2, 502, 602);
OrderCriteria o9 = new OrderCriteria(2, 2, 503, 603);
其中,
OrderCriteria
如下所示:

public class OrderCriteria {
    private final long orderId;
    private final long orderCatalogId;
    private final long procedureId;
    private final long diagnosisId;

    public OrderCriteria(long orderId, long orderCatalogId, long procedureId, long diagnosisId) {
        this.orderId = orderId;
        this.orderCatalogId = orderCatalogId;
        this.procedureId = procedureId;
        this.diagnosisId = diagnosisId;
    }

    // Getters
}
我想要的是获得一个按订单id分组的程序列表和诊断列表。因此它应该返回:

{1, {101, 102}, {201, 202}}
{2, {501, 502, 503}, {601, 602, 603}}

这意味着id为1的订单具有过程id 101、102和诊断id 201、202等。我尝试使用google guava表,但无法找到任何有效的解决方案。

首先,您需要一个新结构来保存分组数据:

class OrderCriteriaGroup {
    final Set<Long> procedures = new HashSet<>();
    final Set<Long> diagnoses = new HashSet<>();

    void add(OrderCriteria o) {
        procedures.add(o.getProcedureId());
        diagnoses.add(o.getDiagnosisId());
    }

    OrderCriteriaGroup merge(OrderCriteriaGroup g) {
        procedures.addAll(g.procedures);
        diagnoses.addAll(g.diagnoses);
        return this;
    }
}

我强烈建议您更改输出结构。根据您的示例,当前可能是
Map
。我建议您使用以下结构区分
“过程:
“诊断”
数据集:

Map<Long, Map<String, Set<Long>>> map = new HashMap<>();
输出:
{1=[[102],[201202]],2=[[501502503],[601602603]}



或者,您可能希望使用2
Set
创建一个新对象来存储数据(另一个答案说明了方法)。

我尝试使用上述解决方案,但由于类型收集器中的方法(Supplier、BiConsumer、binarymoperator、Collector.Characteristics…)不适用于参数,因此出现编译错误(OrderCriteriaGroup::新建,OrderCriteriaGroup::添加,OrderCriteriaGroup::合并)@StonecoldIM有一个小的拼写错误,但它现在对我有效:非常感谢shmosel。上帝保佑你,先生。非常感谢。它对我有效,这将非常有助于继续我目前正在做的事情。祝你有一个美好的一天。非常接近我正在寻找的,但出于某种原因,程序id 101正在这里被过滤。
Map<Long, Map<String, Set<Long>>> map = new HashMap<>();
for (OrderCriteria oc: list) {
     if (map.containsKey(oc.getOrderId())) {
        map.get(oc.getOrderId()).get("procedure").add(oc.getProcedureId());
        map.get(oc.getOrderId()).get("diagnosis").add(oc.getDiagnosisId());
     } else {
        Map<String, Set<Long>> innerMap = new HashMap<>();
        innerMap.put("procedure", new HashSet<>());
        innerMap.put("diagnosis", new HashSet<>());
        map.put(oc.getOrderId(), innerMap);
     }
}
Map<Long, List<Set<Long>>> map = new HashMap<>();   

for (OrderCriteria oc: list) {
     if (map.containsKey(oc.getOrderId())) {    
        map.get(oc.getOrderId()).get(0).add(oc.getProcedureId());
        map.get(oc.getOrderId()).get(1).add(oc.getDiagnosisId());
     } else {
        List<Set<Long>> listOfSet = new ArrayList<>();
        listOfSet.add(new HashSet<>());
        listOfSet.add(new HashSet<>());
        map.put(oc.getOrderId(), listOfSet);
     }
}