group-json

zvms9eto  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(272)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
我有一个json

{  
  "content": [
    {
      "idnumber": "666",
      "name": "mark",
      "type": "band",
      "tools": [
        {
          "idtools": "5657",
          "blabla": null,
          "blabla": false,
        }
      ]
    },
    {
      "idnumber": "666",
      "name": "mark",
      "type": "band",
      "tools": [
        {
          "idtools": "5658",
          "blabla": null,
          "blabla": false
        }
      ]
    }
  ]
}

在content数组中,我有两个json。我想把我的json改成这个,因为它们有相同的id号。

{  
  "content": [
    {
      "idnumber": "666",
      "name": "mark",
      "type": "band",
      "tools": [
        {
          "idtools": "5657",
          "blabla": null,
          "blabla": false,
        },
        {
          "idtools": "5658",
          "blabla": null,
          "blabla": false
        }
      ]
    }
  ]
}

如何使用distinct或filter?
我试着区分它并绘制它,但仍然有错误。

a5g8bdjr

a5g8bdjr1#

假设以下对象与您的json结构匹配(为简洁起见,我使用lombok):

@Data
@AllArgsConstructor
@NoArgsConstructor
class Content {
    int idNumber;
    String name;
    String type;
    List<Tool> tools;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Tool {
    int idTools;
    String blabla;
}

您可以将流api用于 groupingByid 以及 reduce 将这些值合并为一个值。

List<Content> mergedContents = contents.stream()
     .collect(Collectors.groupingBy(Content::getIdNumber))
     .values()
     .stream()
     .reduce(
          new ArrayList<>(),                               // mutable List
          (left, right) -> {
              Content content = right.get(0);              // they are same (by id)
              List<Tool> tools = right.stream()            // from each new list
                      .flatMap(c -> c.getTools().stream()) // .. flatmap the tools
                      .collect(Collectors.toList());       // .. and extract to a list
              content.setTools(tools);                     // set the List<Tool>
              left.add(content);                           // add the Content
              return left;                                 // return the left list
          },
          (left, right) -> left);                          // only for parallel Stream

由此产生的结构 Collectors.groupingBy(Content::getIdNumber)Map<Integer, List<Content>> . Map值的后续可变缩减( Collection<List<Content>> )合并每个 List<Content> 具有相同的 Content.id 变成一个单一的 Content 带平面Map List<Tools> . 具有这些修改的 Content 作为减少的结果返回。
样本数据

List<Content> contents = new ArrayList<>();
contents.add(new Content(666, "Mark", "Band", 
        Collections.singletonList(new Tool(5657, null))));
contents.add(new Content(666, "Mark", "Band", 
        Collections.singletonList(new Tool(5658, null))));

List<Content> mergedContents = /* solution */

mergedContents.forEach(System.out::println);
``` `Main.Content(idNumber=666, name=Mark, type=Band, tools=[Main.Tool(idTools=5657, blabla=null), Main.Tool(idTools=5658, blabla=null)])` 这与您的json示例相同。

相关问题