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