假设我在内存中有两个JSONObject数组,每个对象都有一个在两个数组中相似的键:
数组1
[
{
"name": "Big Melons Co.",
"location": "Inner City Dubai"
"id": "1A"
},
{
"name": "Pear Flavored Juices Ltd",
"location": "Seychelles"
"id": "2A"
},
{
"name": "Squeeze My Lemons LLC",
"location": "UK"
"id": "3A"
}, {other JSON Objects...} ]
数组2
[
{
"acceptsCard": "true"
"id": "1A"
},
{
"acceptsCard": "false"
"id": "2A"
},
{
"acceptsCard": "false"
"id": "3A"
}, {other JSON Objects...} ]
现在,我想根据" id"的主键将两个数组合并在一起。所以他们在我的服务器端成为一个,然后将结果发送回我的前端 - 由此产生的对象的arraylist应该是这样的:
合并阵列(结果)
[
{
"name": "Great Juice Co.",
"location": "Inner City Dubai"
"acceptsCard": "true"
"id": "1A"
},
{
"name": "Pear Flavored Juices Ltd",
"location": "Seychelles"
"acceptsCard": "false"
"id": "2A"
},
{
"name": "Squeeze My Lemons LLC",
"location": "UK"
"acceptsCard": "false"
"id": "3A"
}, {other JSON Objects...} ]
我怎样才能有效地做到这一点?
我可以想到一种非常低效的方法(我实现这一点) - 我会遍历数组1或2中的每个项目,并对&中的字符串使用equal()方法#34; ID"字段,看看两个匹配。如果匹配,我会创建一个新的JSONObject来包含数组1和2中的字段。
答案 0 :(得分:3)
我的Java有点生疏,但我会使用地图。
List<JSONObject> objectsA = ... ;
List<JSONObject> objectsB = ... ;
Map entries = new HashMap<String, JSONObject>();
List<JSONObject> allObjects = new ArrayList<JSONObject>();
allObjects.addAll(objectsA);
allObjects.addAll(objectsB);
for (JSONObject obj: allObjects) {
String key = obj.getString("id");
JSONObject existing = entries.get(key);
if (existing == null) {
existing = new JSONObject();
entries.put(key, existing);
}
for (String subKey : obj.keys()) {
existing.put(subKey, obj.get(subKey));
}
}
List<JSONObject> merged = entries.values();
这比两个嵌套循环更有效,但仍有改进的余地。
编辑:参考外部文档和相关答案。