【问题标题】:Merge 2 list in java based on matching key value基于匹配的键值在java中合并2个列表
【发布时间】:2019-07-13 01:58:10
【问题描述】:

我希望合并列表 1 和列表 2,以获得如下预期的输出。

这两个列表都是 Java 类,还想在预期的结构上添加一个新的 Java 类。

我试过循环遍历 List1 和 List2 但没有成功。

还尝试使用 lambda 表达式,但无法获得预期的输出。

将发布我尝试过的代码。

非常感谢任何帮助。

列表1(初级区):

{
“One”: [
    "G13DA"
],
“Two”: [
    "G13AA",
    "G13AD"
]
}

清单 2:

[
{
    "subgroupCode": "G13AA",
    "productGroup": [
        {
            "productCode": "G1A",
            "productDescription": “Two 1"
        },
        {
            "productCode": "G9B",
            "productDescription": “Two 2"
        }
    ]
},
{
    "subgroupCode": "G13AD",
    "productGroup": [
        {
            "productCode": "G4A",
            "productDescription": “Two 3”
        },
        {
            "productCode": "G9C",
            "productDescription": “Two 4”
        }
    ]
},
{
    "subgroupCode": "G13DA",
    "productGroup": [
        {
            "productCode": "G5M",
            "productDescription": “One 1"
        },
        {
            "productCode": "G9M",
            "productDescription": “One 2"
        }
    ]
}
]

预期输出:

{
   "juniorArea": [   
{      
 "juniorAreaDescription": “One”,
          "mechandisingGroup": [
         {
                "productCode": "G5M",
                "productDescription": “One 1"
         },
         {
                "productCode": "G9M",
                "productDescription": “One 2"
         }
      ]
    },
    {
      "juniorAreaDescription": “Two”,
      "mechandisingGroup": [
         {
                "productCode": "G1A",
                "productDescription": “Two 1"
         },
         {
                "productCode": "G9B",
                "productDescription": “Two 2"
         },
     {
                "productCode": "G4A",
                "productDescription": “Two 3”
         },
         {
                "productCode": "G9C",
                "productDescription": “Two 4”
         }
      ]
    }
  ]
}

【问题讨论】:

  • 你试过什么?你目前在哪里挣扎?这些 JSON 对象是您想要合并到另一个 JSON 对象中还是它们是 Java 类? -> 请通过edit 澄清
  • @Emraan 您可以为列表中的对象添加类吗?

标签: java list merge


【解决方案1】:

您将需要使用 Google 的 gson 库来解析您的 json 字符串,并创建附加类来保存相同的数据。将您的 json 字符串保存在文件中以读取内容并将它们转换为适当的对象。

您提到的 JSON 字符串有错误,因为您在许多地方都使用了 (")。在所有位置将它们替换为 (")。此更改非常重要,因为如果您不这样做,您可能会得到异常或不需要的输出。

按如下方式存储您的 Json 字符串:

List1.txt

{
"One": [
    "G13DA"
],
"Two": [
    "G13AA",
    "G13AD"
]
}

List2.txt

[
{
    "subgroupCode": "G13AA",
    "productGroup": [
        {
            "productCode": "G1A",
            "productDescription": "Two 1"
        },
        {
            "productCode": "G9B",
            "productDescription": "Two 2"
        }
    ]
},
{
    "subgroupCode": "G13AD",
    "productGroup": [
        {
            "productCode": "G4A",
            "productDescription": "Two 3"
        },
        {
            "productCode": "G9C",
            "productDescription": "Two 4"
        }
    ]
},
{
    "subgroupCode": "G13DA",
    "productGroup": [
        {
            "productCode": "G5M",
            "productDescription": "One 1"
        },
        {
            "productCode": "G9M",
            "productDescription": "One 2"
        }
    ]
}
]

您需要在运行程序时更改这两个文件的路径

添加以下类

JuniorArea.class

public class JuniorArea {
    private String juniorAreaDescription;
    private List<MerchandisingGroup> mechandisingGroup;

    public String getJuniorAreaDescription() {
        return juniorAreaDescription;
    }
    public void setJuniorAreaDescription(String juniorAreaDescription) {
        this.juniorAreaDescription = juniorAreaDescription;
    }
    public List<MerchandisingGroup> getMechandisingGroup() {
        return mechandisingGroup;
    }
    public void setMechandisingGroup(List<MerchandisingGroup> mechandisingGroup) {
        this.mechandisingGroup = mechandisingGroup;
    }

    @Override
    public String toString() {
        return "JuniorArea [juniorAreaDescription=" + juniorAreaDescription + ", mechandisingGroup=" + mechandisingGroup
                + "]";
    }
} 

JuniorAreaCollection.class

public class JuniorAreaCollection {
    private List<JuniorArea> juniorArea;

    public List<JuniorArea> getJuniorArea() {
        return juniorArea;
    }

    public void setJuniorArea(List<JuniorArea> juniorArea) {
        this.juniorArea = juniorArea;
    }

    @Override
    public String toString() {
        return "JuniorAreaCollection [juniorArea=" + juniorArea + "]";
    }
}

MerchandisingGroup.class

public class MerchandisingGroup {
    private String productCode;
    private String productDescription;

    public String getProductCode() {
        return productCode;
    }
    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }
    public String getProductDescription() {
        return productDescription;
    }
    public void setProductDescription(String productDescription) {
        this.productDescription = productDescription;
    }

    @Override
    public String toString() {
        return "MechandisingGroup [productCode=" + productCode + ", productDescription=" + productDescription + "]";
    }
}

产品.class

public class Product {
    private String subgroupCode;
    private List<ProductGroup> productGroup;

    public String getSubgroupCode() {
        return subgroupCode;
    }
    public void setSubgroupCode(String subgroupCode) {
        this.subgroupCode = subgroupCode;
    }
    public List<ProductGroup> getProductGroup() {
        return productGroup;
    }
    public void setProductGroup(List<ProductGroup> productGroup) {
        this.productGroup = productGroup;
    }

    @Override
    public String toString() {
        return "Product [subgroupCode=" + subgroupCode + ", productGroup=" + productGroup + "]";
    }
}

ProductGroup.class

public class ProductGroup {
    private String productCode;
    private String productDescription;

    public String getProductCode() {
        return productCode;
    }
    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }
    public String getProductDescription() {
        return productDescription;
    }
    public void setProductDescription(String productDescription) {
        this.productDescription = productDescription;
    }

    @Override
    public String toString() {
        return "ProductGroup [productCode=" + productCode + ", productDescription=" + productDescription + "]";
    }
}

最后运行下面的 Main Class 代码,检查输出

public class MainRunner {
    // Use Path according to your file system
    private static String List1Path = "/List1.txt";

    // Use Path according to your file system
    private static String List2Path = "/List2.txt";

    public static void main(String...arg) throws UnsupportedEncodingException, IOException {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        String List1Content = new String(Files.readAllBytes(Paths.get(List1Path)), "UTF-8");

        Map<String, List<String>> map = new HashMap<>();

        map = gson.fromJson(List1Content, new TypeToken<Map<String, List<String>>>() {}.getType());

        System.out.println(map);

        String List2Content = new String(Files.readAllBytes(Paths.get(List2Path)), "UTF-8");

        List<Product> products = gson.fromJson(List2Content, new TypeToken<List<Product>>() {}.getType());

        System.out.println(products);

        List<JuniorArea> juniorAreas = new ArrayList<>();

        for (String s : map.keySet()) {
            JuniorArea juniorArea = new JuniorArea();

            juniorArea.setJuniorAreaDescription(s);

            List<MerchandisingGroup> merchandisingGroups = new ArrayList<>();

            List<String> subgroupCodes = map.get(s);

            for (String subgroupCode : subgroupCodes) {

                for (Product product : products) {

                    if (product.getSubgroupCode().equals(subgroupCode)) {
                        List<ProductGroup> productGroups = product.getProductGroup();

                        for (ProductGroup productGroup : productGroups) {
                            MerchandisingGroup merchandisingGroup = new MerchandisingGroup();

                            merchandisingGroup.setProductCode(productGroup.getProductCode());
                            merchandisingGroup.setProductDescription(productGroup.getProductDescription());

                            merchandisingGroups.add(merchandisingGroup);
                        }
                    }

                }

            }

            juniorArea.setMechandisingGroup(merchandisingGroups);

            juniorAreas.add(juniorArea);
        }

        JuniorAreaCollection collection = new JuniorAreaCollection();

        collection.setJuniorArea(juniorAreas);

        System.out.println(gson.toJson(collection));
    }
}

输出应该打印在您的控制台上

{
  "juniorArea": [
    {
      "juniorAreaDescription": "One",
      "mechandisingGroup": [
        {
          "productCode": "G5M",
          "productDescription": "One 1"
        },
        {
          "productCode": "G9M",
          "productDescription": "One 2"
        }
      ]
    },
    {
      "juniorAreaDescription": "Two",
      "mechandisingGroup": [
        {
          "productCode": "G1A",
          "productDescription": "Two 1"
        },
        {
          "productCode": "G9B",
          "productDescription": "Two 2"
        },
        {
          "productCode": "G4A",
          "productDescription": "Two 3"
        },
        {
          "productCode": "G9C",
          "productDescription": "Two 4"
        }
      ]
    }
  ]
}

【讨论】:

  • 嗨@Dinesh,按照建议对数据模型进行了一些更改,该解决方案就像一个魅力。非常感谢。
  • 嗨@Dinesh,我们合并2个列表的上述代码部分正在影响性能。我们可以有一个逻辑来使用 lambda 表达式,两个列表的交集来完成它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多