Java - 公共数组元素的分组

时间:2018-02-28 06:59:26

标签: java json

我试图对所有常见的数组元素进行分组。例如

array = [{ 'LA',1},
         { 'LA',1},
         { 'NY',2},
         { 'NY',3},
         { 'LA',1}]

从这个数组中,我试图将一个组中的所有ONE元素和另一个组中的TWO元素组合在一起,并且三个也是。

请找到我在javascript中制作的以下代码,但是,我如何使用java制作相同的功能

Java脚本: - (能够正确分组)

Arrays.forEach(function (a) {
    grouped[a.number] = grouped[a.number] || [];
    grouped[a.number].push(a);
    });

Java: - (但它没有正确循环)

for(int i=0;i<lineItemsArray1.length();i++)
    {
    JSONObject lineObj1 = lineItemsArray1.getJSONObject(i);
    for(int j=i+1;j<lineItemsArray2.length();j++)
    {
    JSONObject  lineObj2 = lineItemsArray2.getJSONObject(j);
    if(lineObj1.getString("number").
    equalsIgnoreCase(lineObj2.getString("number")))
    {
     System.out.println("Number from OuterLoop ---
       >"+lineObj1.getString("number")+":::from InnerLoop ---
       >"+lineObj2.getString("number"));
         //int numbers=Integer.parseInt(lineObj1.getString("number"));
    }
    }
                }

对于上面提到的数组,我期待的结果如下:

    Number from OuterLoop --->1:::from InnerLoop --->1
    Number from OuterLoop --->1:::from InnerLoop --->1
    Number from OuterLoop --->1:::from InnerLoop --->1
    Number from OuterLoop --->2:::from InnerLoop --->2
    Number from OuterLoop --->3:::from InnerLoop --->3

但我得到的结果如下:(这是不正确的)

    Number from OuterLoop --->1:::from InnerLoop --->1
    Number from OuterLoop --->1:::from InnerLoop --->1
    Number from OuterLoop --->1:::from InnerLoop --->1

2 个答案:

答案 0 :(得分:0)

认为你想要的是这个

Map<String, List<JSONObject>> map = IntStream.range(0, lineItemArray.size())
    .mapToObj(lineItemArray::getJSONObject)
    .groupingBy(item -> item.getString("number"));

为您的示例提供了包含<{p}}的Map

["1" = [{"1", "LA"}, {"1", "LA"}, {"1", "LA"}],
 "2" = [{"2", "NY"}],
 "3" = [{"3", "NY"}]]

(既不是有效的JSON也不是实际的Map#toString输出,但我想很明显是什么意思。)

答案 1 :(得分:0)

最后,我得到了对常见JSONArray元素进行分组的方法。

Map<Object, List<JSONObject>> numberMap = IntStream.range(0, lineItemsArray.length())
                .mapToObj(index -> (JSONObject) lineItemsArray.get(index))
                .collect(Collectors.groupingBy(item -> item.get("number")));