将对象值列表转换为组

时间:2018-08-15 21:16:57

标签: 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 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番石榴表,但找不到任何有效的解决方案。

2 个答案:

答案 0 :(得分:0)

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

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

add()merge()是方便的方法,可以帮助我们流式传输和收集数据,如下所示:

Map<Long, OrderCriteriaGroup> grouped = criteriaList.stream()
        .collect(Collectors.groupingBy(OrderCriteria::getOrderId,
                Collector.of(
                        OrderCriteriaGroup::new,
                        OrderCriteriaGroup::add,
                        OrderCriteriaGroup::merge)));

答案 1 :(得分:0)

我强烈建议您更改输出结构。根据您的示例,当前电流可能为Map<List<Set<Long>>>。我建议您使用以下结构来区分"procedure:"diagnosis"数据集:

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

输出:{1={diagnosis=[201, 202], procedure=[102]}, 2={diagnosis=[601, 602, 603], procedure=[501, 502, 503]}}


如果您坚持要草拟的结构,则必须记住,第一个Set包含过程,第二个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); } } 包含诊断,并且维护不切实际。

{1=[[102], [201, 202]], 2=[[501, 502, 503], [601, 602, 603]]}

输出:Set<Long>


或者,您可能希望使用2个BrowserRouter创建一个新对象来存储数据(另一个答案显示了方式)。