Java JSONArray - 将元素与同一JSONArray

时间:2018-02-26 16:31:36

标签: java json

将javascript数组元素与同一数组中的其他元素进行比较。如果元素是相同的意思,我必须为所有共同元素给出相同的数字。如果元素不同,我必须为另一个元素中的所有非相同元素提供一些不同的数字。

例如:

Array structure = [{Location, Date, Number}]
array = [{ 'LA','2017-12-01',1},
     { 'LA','2017-12-01',1},
     { 'NY','2017-12-01',2},
     { 'NY','2016-10-01',3},
     { 'LA','2017-12-01',1},
     { 'LA','2017-12-01',1},
     { 'LA','2017-12-01',1}]

在这个数组'数字'是动态元素,应该填充以下规则。

`key1 = location + '-' +date;`

考虑Key1是第一个元素(位置+日期的组合)。如果阵列中存在相同的key1,那么' Number'对于所有相同的Key1都是通用的。

在上面的示例{'LA','2017-12-01',1 }中,编号为1。

{ 'NY','2017-12-01',2}的数字为2.和{ 'NY','2016-10-01',3},数字为3,因为虽然位置很常见,但日期不同。

请在下面找到我正在尝试的代码。但它为所有数组元素赋予相同的数字。

JSONObject orderObj=database.getOrder(salesorderId);
JSONArray lineArr = orderObj.getJSONArray("order_items"); //lines
JSONObject lineObj = null;
for(int i=0;i<lineArr.length();i++)
{
lineObj = lineArr.getJSONObject(i);
String source_location=lineObj.getString("source_location");
String key=source_location.concat(lineObj.has("ship_date") ? 
lineObj.getString("ship_date") : lineObj.getString("req_ship_date"));
Map map=new HashMap();
if(!map.containsKey(key)){
map.put(key, map.size()+1);
}
lineObj.put("number", map.get(key).toString());
}
orderObj.append("order_items", lineObj);

1 个答案:

答案 0 :(得分:0)

map的实例化移出for循环:

JSONObject orderObj = database.getOrder(salesorderId);
JSONArray lineArr = orderObj.getJSONArray("order_items"); //lines
JSONObject lineObj = null;
// To here:
Map map = new HashMap();
for ( int i = 0; i < lineArr.length(); ++i )
{
  lineObj = lineArr.getJSONObject(i);
  String source_location = lineObj.getString("source_location");
  String key = source_location.concat( lineObj.has("ship_date") ?
               lineObj.getString("ship_date") : lineObj.getString("req_ship_date"));
  // From here: Map map=new HashMap();
  if ( !map.containsKey(key) )
  {
    map.put(key, map.size() + 1);
  }
  lineObj.put("number", map.get(key).toString());
}
orderObj.append("order_items", lineObj);