我做了一个jsonobjects数组。现在,我需要根据来自sort对象的值对JSONArray进行排序。以前,我对自定义对象的ArrayLists进行了如下排序:
比较国:
public class KreeftenComparatorLA implements Comparator<Kreeft> {
public int compare(Kreeft left, Kreeft right) {
return left.latijnseNaam.compareTo(right.latijnseNaam);
}
}
public class KreeftenComparatorNL implements Comparator<Kreeft> {
public int compare(Kreeft left, Kreeft right) {
return left.naam.compareTo(right.naam);
}
}然后对排列列表进行排序:
Collections.sort(db.lijst, new KreeftenComparatorLA());或者:
Collections.sort(db.lijst, new KreeftenComparatorNL());但是,当我像这样对JSONArray进行同样的尝试时(JA =我的jsonarray)
Collections.sort(JA, new KreeftenComparatorNL());Collections.sort提供了一个错误:
类型集合中的方法排序(列表、比较器)不适用于参数(JSONArray、ThisActicity.KreeftenComparatorNL)
有人知道如何对JSONArray?进行排序吗?
发布于 2012-10-15 19:55:18
问题是JSONArray或多或少地持有JSONObjects (和其他JSONArrays),这最终是字符串。将字符串完全反序列化为POJO,对这些字符串进行排序,然后返回到JSON中是相当繁重的。
第二个问题是,JSONArray可以包含:布尔值、JSONArray、JSONObject、Number、String或JSONObject.NULL对象;也就是说,它是混合类型,因此很难将元素转储到某种类型和排序的列表中,然后通过列表转储排序的项返回到JSON数组中。从JSONArray获取每个元素的公共类型的唯一特定方法是使用Object get()方法。当然,您所拥有的只是对象对象,如果不重新查看序列化问题,就无法对它们进行任何有意义的排序。
假设您的JSONArray包含结构一致的值,您可以遍历JSONArray,在每个方法上调用一个类型化的get()方法,将它们转储到一个列表类型中,然后对其进行排序。如果您的JSONArray只包含“简单”类型,如字符串或数字,这是相对容易的。这不是确切的代码,但类似于:
List<String> jsonValues = new ArrayList<String>();
for (int i = 0; i < myJsonArray.length(); i++)
jsonValues.add(myJsonArray.getString(i));
Collections.sort(jsonValues);
JSONArray sortedJsonArray = new JSONArray(jsonValues);当然,如果您有嵌套对象,这可能会变得更加棘手。如果您希望在顶层进行排序的值,它可能并不坏.
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < myJsonArray.length(); i++)
jsonValues.add(myJsonArray.getJSONObject(i));然后使用这样的比较器进行排序:
class JSONComparator implements Comparator<JSONObject>
{
public int compare(JSONObject a, JSONObject b)
{
//valA and valB could be any simple type, such as number, string, whatever
String valA = a.get("keyOfValueToSortBy");
String valB = b.get("keyOfValueToSortBy");
return valA.compareTo(valB);
//if your value is numeric:
//if(valA > valB)
// return 1;
//if(valA < valB)
// return -1;
//return 0;
}
}同样,这也对JSONArray中数据的同质性做出了一些假设。如果可能的话,调整一下你的情况。此外,您还需要添加您的异常处理等。愉快的编码!
基于注释的编辑
发布于 2012-10-31 20:47:33
为了填补一个安卓列表ArrayAdapter,我需要这样做。我就是这样做的:
从JSONArray构建列表的活动代码:
JSONArray kids = node.getJSONArray("contents");
kids = JSONUtil.sort(kids, new Comparator(){
public int compare(Object a, Object b){
JSONObject ja = (JSONObject)a;
JSONObject jb = (JSONObject)b;
return ja.optString("name", "").toLowerCase().compareTo(jb.optString("name", "").toLowerCase();
}
});
// in my case I wanted the original larger object contents sorted...
node.put("contents", kids);在JSONUtil (我的助手)中:
public static JSONArray sort(JSONArray array, Comparator c){
List asList = new ArrayList(array.length());
for (int i=0; i<array.length(); i++){
asList.add(array.opt(i));
}
Collections.sort(asList, c);
JSONArray res = new JSONArray();
for (Object o : asList){
res.put(o);
}
return res;
}发布于 2012-10-24 19:31:08
仅仅为了清除排序比较器上面的代码是不正确的。在Ruby这样的语言中,您不能像上面那样比较字符串。这可以写得更简洁,如下所示。否则,逻辑是合理的。
Collections.sort( jsonValues, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject a, JSONObject b) {
String valA = new String();
String valB = new String();
try {
valA = (String) a.get("keyOfValueToSortBy");
valB = (String) b.get("keyOfValueToSortBy");
}
catch (JSONException e) {
Log.e(LOG_TAG, "JSONException in combineJSONArrays sort section", e);
}
return valA.compareTo(valB);
}
});https://stackoverflow.com/questions/12901742
复制相似问题