【问题标题】:Sorting an ArrayList using another ArrayList field for a Custom Object使用自定义对象的另一个 ArrayList 字段对 ArrayList 进行排序
【发布时间】:2019-07-26 00:44:32
【问题描述】:

我有 2 个数组列表,一个自定义对象的 RequestList 和 ResponseList。 请求列表有 10 个带有 RequestHeader 和 RequestBody 的soap 请求。 10 是一个示例(甚至可能是 1000 条或更多甚至 100 万条记录) 现在,RequestHeader(Header.java) 有一个 String 类型的 RequestId 元素

请求对象

<CustomClassRequest>
 <header>
    <RequestId>1</RequestId>
 </header>
 <Body></Body>
</CustomClassRequest>

假设RequestList有10个soap请求,requestId从1到10 (使用数字来简化这个用例)

现在,我并行触发这些肥皂请求并取消插入订单 当我收到我的请求列表中的回复时。 因此,我的 ResponseList 将得到所有这 10 个肥皂请求的响应 但 requestId 的顺序不同。

响应对象

<CustomClassResponse>
 <header>
    <RequestId>1</RequestId>
 </header>
 <Body></Body>
</CustomClassResponse>

注意:响应中的标头属于不同的类 ResponseHeader.java

我可以使用公共字段 RequestId 对我的 ResponseList 进行排序吗 根据插入顺序,RequestList 是如何存在的。

如果 Java 8 API 有可能的解决方案或什至使用任何第三方解决方案,请告诉我

【问题讨论】:

  • 我假设请求 ID 没有在请求列表中排序,否则您可以单独对响应列表进行排序。我认为您需要遍历请求列表,找到相应的响应并将其添加到新的 ArrayList

标签: java sorting arraylist java-8


【解决方案1】:

你可以使用java8 lambda表达式

例如

resposneList.stream()
   .sorted((o1, o2) -> o1.getHeader().getRequestId()
   .compareTo(o2.getHeader().getRequestId()))`

【讨论】:

    【解决方案2】:

    您不应该使用 Comparator,因为您不会比较它们之间的列表元素来计算它们的顺序。
    您可以从将 id 关联到响应的响应列表中创建一个 Map。
    然后流式传输请求并将其 id 映射到映射键。
    这是为响应创建新列表的解决方案:

    Map<Integer, Response> responseByIdMap = responses.stream()
                                                      .collect(toMap(Response::getId, r->r);
    
    responses = 
    request.stream()
           .map( req -> responseByIdMap.get(req.getId))
           .collect(toList());
    

    【讨论】:

    • 感谢您的快速回复,让我试试这个方法。
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多