我有一个带有5个不同JSONObject的JSONArray,并且这5个JSONObject中的每个都有一个标识符字符串值。这五个值是“ aa”,“ bb”,“ erer”,“ cc”,“ gg”。我的要求是将标识符为“ erer”的JSONObject放在首位,以下JSONObjects可以按任何顺序排列。 json是:
{
"obj":[
{"identifier":"aa",},
{"identifier":"bb",},
{"identifier":"erer",},
{"identifier":"cc",},
{"identifier":"gg",}
]
}
最终结果必须是“ erer”,“ aa”,“ bb”,“ cc”,“ gg”,我需要在单个循环中执行此操作。
我能够在两个循环中做到这一点。
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject j = jsonArray.getJSONObject(i);
if(j.getString("identifier").equals("erer")) {
sortedJson.put(joPayLoad);
}
}
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject j = jsonArray.getJSONObject(i);
if(!j.getString("identifier").equals("erer")) {
sortedJson.put(joPayLoad);
}
}
但是JsonArrray可能还具有10,000个JSONObject。因此,此“两个for循环”将导致性能下降。因此,请帮助我在单个循环中达到上述要求。 预先感谢!
答案 0 :(得分:1)
您需要两个指针,一个读指针和一个写指针。两者都从最后一项开始。在读取指针处读取元素。如果是“错误”,则只需递减读指针,否则将元素写入写指针,并同时减小读指针和写指针。在某些时候,读取指针将减少为零。如果写入指针> 0,则意味着您找到了一些未写入的“错误”元素。将它们写入写指针,并减小写指针,直到它也为零为止。
String[] data = { "aa", "gg", "dd", "ee", "erer", "gg", "erer" };
int r = data.length - 1, w = data.length - 1;
while (r >= 0) {
if (!"erer".equals(data[r])) {
data[w] = data[r];
w--;
}
r--;
}
while (w >= 0) {
data[w] = "erer";
w--;
}
好的,从技术上讲,这里仍然有两个循环,但是应该清楚的是,我们只对数组进行了一次迭代。如果您真的有一个循环,那么它将起作用...
int r = data.length - 1, w = data.length - 1;
while (w >= 0) {
if (r >= 0) {
if (!"erer".equals(data[r])) {
data[w--] = data[r];
}
r--;
} else {
data[w--] = "erer";
}
}
答案 1 :(得分:1)
鉴于JsonArray
是一个列表(source),您可以尝试将值与erer
交换为新的第一个元素:
for (int i = 0; i < jsonArray.length(); i++) {
JsonValue j = jsonArray.get(i);
if(j.getString("identifier").equals("erer")) {
JsonValue tmp = jsonArray.get(0);
jsonArray.set(0, j);
jsonArray.set(i, tmp);
break;
}
}
由于我没有安装EE,因此没有尝试过,但是也许您可以使用提供的方法使它起作用。