Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用单for循环对JSONArray排序_Java_Json - Fatal编程技术网

Java 使用单for循环对JSONArray排序

Java 使用单for循环对JSONArray排序,java,json,Java,Json,我有一个包含5个不同JSONObject的JSONArray,每个JSONObject都有一个标识符字符串值。这五个值是“aa”、“bb”、“erer”、“cc”、“gg”。我的要求是将标识符为“erer”的JSONObject放在第一位,下面的JSONObject可以是任意顺序。 json是: { "obj":[ {"identifier":"aa",}, {"identifier":"bb",}, {"identifier":"erer",}, {"identifier":"cc",}, {

我有一个包含5个不同JSONObject的JSONArray,每个JSONObject都有一个标识符字符串值。这五个值是“aa”、“bb”、“erer”、“cc”、“gg”。我的要求是将标识符为“erer”的JSONObject放在第一位,下面的JSONObject可以是任意顺序。 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);
}
}
for(int i=0;i
但是JSONarray也可能有10000个JSONObject。因此,这种“两个for循环”将导致性能滞后。所以,请帮助我在一个循环中实现上述要求。
提前谢谢

您需要两个指针,一个读指针和一个写指针。两者都从最后一项开始。在读取指针处读取元素。如果是“erer”,则只需减小读取指针,否则,将元素写入写入写入指针,并同时减小读取指针和写入指针。在某个点上,读取指针将减少到零。如果写入指针大于0,则表示您找到了一些未写入的“erer”元素。将它们写入写入指针,并递减写入指针,直到它也为零

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";
    }
}

您需要两个指针,一个读指针和一个写指针。两者都从最后一项开始。在读取指针处读取元素。如果是“erer”,则只需减小读取指针,否则,将元素写入写入写入指针,并同时减小读取指针和写入指针。在某个点上,读取指针将减少到零。如果写入指针大于0,则表示您找到了一些未写入的“erer”元素。将它们写入写入指针,并递减写入指针,直到它也为零

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";
    }
}

给定
JsonArray
是一个列表(),您可以尝试将该值与
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;
     }
}
for(int i=0;i

由于我没有安装EE,所以没有尝试过它,但也许您可以使用提供的方法使其工作。

给定的
JsonArray
是一个列表(),您可以尝试将值与
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;
     }
}
for(int i=0;i

我没有尝试过,因为我没有安装EE,但也许您可以使用提供的方法使其工作。

我想您可以选择两个列表,一个是放置所有
erer
-对象,另一个是其他对象,然后在运行for循环一次后简单地将它们合并。如果使用Java,还可以使用
addFirst
addLast
,具体取决于所处理的对象。请查看这些方法的分类,其中类型是
sortedJson
jsonArray
?不强制对其他jsonobject进行分类。我的要求是将“erer”排在第一位,以下元素可以是“gg”、“aa”、“cc”、“bb”。没关系,我只道歉一个字,幽灵猫。没有借口。非常感谢您的时间。我想您可以选择两个列表,一个是放置所有
erer
-对象的列表,另一个是包含其余对象的列表,然后在运行for循环一次后简单地将它们合并。如果使用Java,还可以使用
addFirst
addLast
,具体取决于所处理的对象。请查看这些方法的分类,其中类型是
sortedJson
jsonArray
?不强制对其他jsonobject进行分类。我的要求是将“erer”排在第一位,以下元素可以是“gg”、“aa”、“cc”、“bb”。没关系,我只道歉一个字,幽灵猫。没有借口。非常感谢您的时间。这与他的双循环示例不同,它可以处理任意数量的“erer”元素。没错,但从问题来看,似乎只有一个元素,这应该是第一个元素。这与他的双循环示例不同,后者可以处理任意数量的“erer”元素。没错,但是从这个问题来看,似乎只有一个元素,这应该是第一个元素。这个问题被标记为
Java
,而不是
JavaScript
。你说得对!有趣的是,我用Java编写了它,并将其转换为JS,因为我认为他使用的是JS。此外,我正在“排序”字符串,而不是JSONObject实例。但关键是要说明循环。OP知道如何使用JSONObject。这个问题被标记为
Java
,而不是
JavaScript
。你说得对!有趣的是,我用Java编写了它,并将其转换为JS,因为我认为他使用的是JS。此外,我正在“排序”字符串,而不是JSONObject实例。但关键是要说明循环。OP知道如何使用JSONObject。