用单个for循环对JSONArray进行排序

时间:2019-06-22 19:21:07

标签: java json

我有一个带有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循环”将导致性能下降。因此,请帮助我在单个循环中达到上述要求。 预先感谢!

2 个答案:

答案 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,因此没有尝试过,但是也许您可以使用提供的方法使它起作用。

相关问题