在Android中如何按日期对数组项进行分组?

时间:2019-10-07 07:35:30

标签: java arrays json

对象的array


    Statement:[
       {
       "date": "12-09-19 11:02:47",
       "Country": "Bangladesh",
       "Profession": "X",
       "Salary": "100",
       },
       {
       "date": "12-09-19 11:02:47",
       "Country": "Bangladesh",
       "Profession": "Y",
       "Salary": "101",
       },
       {
       "date": "12-09-19 11:02:47",
       "Country": "Bangladesh",
       "Profession": "Z",
       "Salary": "102",
       },
       {
       "date": "11-09-19 11:02:47",
       "Country": "India",
       "Profession": "I",
       "Salary": "103",
       },
       {
       "date": "11-09-19 11:02:47",
       "Country": "India",
       "Profession": "J",
       "Salary": "104",
       },
       {
       "date": "10-09-19 11:02:47",
       "Country": "Nepal",
       "Profession": "N",
       "Salary": "105",
       },
       {
       "date": "10-09-19 11:02:47",
       "Country": "Nepal",
       "Profession": "M",
       "Salary": "106",
       }
       ]

我正在尝试创建一个新的array,它将创建一个object,并且每个日期(作为键)和其他信息都位于同一object中。

新数组应如下所示:

    "10-09-19": [
    {
      "Country": "Nepal",
      "Profession": "M",
      "Salary": "106",
    },
    {
      "Country": "Nepal",
      "Profession": "N",
      "Salary": "105",
    }
    ],
    "11-09-19": [{
      "Country": "India",
      "Profession": "J",
       "Salary": "104",
    },
    {
      "Country": "India",
      "Profession": "I",
      "Salary": "103",
    }
    ],
    "12-09-19": [{
      "Country": "Bangladesh",
      "Profession": "x",
       "Salary": "104",
    },
    {
      "Country": "Bangladesh",
      "Profession": "y",
      "Salary": "103",
    },
    {
      "Country": "Bangladesh",
      "Profession": "z",
      "Salary": "102",
    }
    ]



5 个答案:

答案 0 :(得分:0)

您可以使用Java 8 group by。希望下面的代码对您有帮助

Map<String, List<Pojo>> groupedList = 
list.stream().collect(Collectors.groupingBy(Pojo::getDate, Collectors.toList()));

答案 1 :(得分:0)

使用哈希图明智地存储数据。 hashmap的键将是date。 这是我的代码,它可以帮助您理解逻辑。

      var sortedList= HashMap<String, MutableList<Model>>() // create hashmap to store data
        var temp: MutableList<Model>? = ArrayList<Model>()
        for (item in currentList!!) {
            temp = sortedList?.get(item.date.split(" ").get(0)) // get date and remove timing

            if (temp != null)     //if this is not null it mean this contain items
                temp.add(item)
            else {
                temp = ArrayList<Model>()  //if this is null it means this is new data or new data
                temp.add(item)
            }

            sortedList?.put(item.date.split(" ").get(0), temp)
    }

我的代码在kotlin中对此表示抱歉。 编码愉快。

答案 2 :(得分:0)

首先循环数组以获取日期。 创建日期的JSONArray,如下所示。

fillRect()

//在添加所需对象的同时遍历数组

JSONArray jsonArray = new JSONArray("date");

答案 3 :(得分:0)

我假设您提供的都是JSON字符串(但它们看起来无效),那么您可以按以下方式实现转换:

ObjectMapper mapper = new ObjectMapper();
ObjectNode root = (ObjectNode) mapper.readTree(jsonStr);
ObjectNode rootNew = mapper.createObjectNode();
for (int i = 0; i < root.get("Statement").size(); i++) {
    String date = root.get("Statement").get(i).get("date").asText().split(" ")[0];
    ObjectNode node = (ObjectNode) ((ObjectNode) root.get("Statement").get(i));
    node.remove("date");
    if (rootNew.has(date)) {
        ((ArrayNode) rootNew.get(date)).add(node);
    } else {
        rootNew.put(date, mapper.createArrayNode().add(node));
    }
}
System.out.println(rootNew.toString());

控制台输出:

{
  "12-09-19":[
    {
      "Country":"Bangladesh",
      "Profession":"X",
      "Salary":"100"
    },
    {
      "Country":"Bangladesh",
      "Profession":"Y",
      "Salary":"101"
    },
    {
      "Country":"Bangladesh",
      "Profession":"Z",
      "Salary":"102"
    }
  ],
  "11-09-19":[
    {
      "Country":"India",
      "Profession":"I",
      "Salary":"103"
    },
    {
      "Country":"India",
      "Profession":"J",
      "Salary":"104"
    }
  ],
  "10-09-19":[
    {
      "Country":"Nepal",
      "Profession":"N",
      "Salary":"105"
    },
    {
      "Country":"Nepal",
      "Profession":"M",
      "Salary":"106"
    }
  ]
}

答案 4 :(得分:0)

首先,谢谢大家回答我的问题。我有一个解决方案,后来找到了。我想我应该和你们分享。

JSONArray statementArray = response.getJSONArray("statement");

Map<String, List<String>> map= new HashMap<String, List<String>>();
for(int i = 0; i < statementArray.length(); i ++) {

   JSONObject mJsonObjectStatement = statementArray.getJSONObject(i);
   String date= mJsonObjectStatement.getString("date").split(" ")[0];
   List<String> valSet = new ArrayList<String>();
   valSet.add(0,mJsonObjectStatement.getString("Country"));
   valSet.add(1,mJsonObjectStatement.getString("Profession"));
   valSet.add(2,mJsonObjectStatement.getString("Salary"));
   map.put(date,valSet);
}
for (Map.Entry<String, List<String>> entry : transactionReportMap.entrySet()) {
   String key = entry.getKey();
   List<String> values = entry.getValue();
   Log.e("Key = " , key);
   Log.e("Values = " , values + "n");
}
Log.e("Result:",map.toString());

上述解决方案无法提供相同的结果,但可以达到我的目的。

我找到了另一个解决方案

JSONArray statementArray = response.getJSONArray("statement");

ObjectMapper mapper = new ObjectMapper();
Map<String, List<String>> map= new HashMap<String, List<String>>();
for(int i = 0; i < statementArray.length(); i ++) {
   JSONObject mJsonObjectStatement = statementArray.getJSONObject(i);
   String date= mJsonObjectStatement.getString("date").split(" ")[0];
   if (transactionReportMap.containsKey(date)) {
       map.get(date).add(date);
   } else {
       ArrayList<String> infoList = new ArrayList<String>();
       infoList.add(mJsonObjectStatement.getString("Country"));
       infoList.add(mJsonObjectStatement.getString("Profession"));
       infoList.add(mJsonObjectStatement.getString("Salary"));
       map.put(date, infoList);
   }
}
StringWriter result = new StringWriter();
try {
  mapper.writeValue(result, map);
} catch (IOException e) {
  e.printStackTrace();
}
Log.e("Result: ",result+"");