25

jsonobjects の jsonarray を作成しました。ここで、jsonobjects の値に基づいて JSONArray をソートする必要があります。以前は、カスタム オブジェクトの ArrayList を次のように並べ替えていました。

コンパレータ:

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 = my jsonarray)

Collections.sort(JA, new KreeftenComparatorNL());

Collections.sort はエラーを出します:

Collections 型のメソッド sort(List, Comparator) は、引数 (JSONArray、ThisActivity.KreeftenComparatorNL) には適用されません。

JSONArray をソートする方法を知っている人はいますか?

4

6 に答える 6

41

問題は、JSONArray が多かれ少なかれ、最終的に文字列である JSONObjects (および他の JSONArrays) を保持することです。文字列を完全に POJO に逆シリアル化し、それらを並べ替えてから JSON に戻すのは、かなり重い作業です。

2 つ目の問題は、JSONArray に次のオブジェクトを含めることができることです: Boolean、JSONArray、JSONObject、Number、String、または JSONObject.NULL オブジェクト。つまり、型が混在しているため、要素を特定の型の List にダンプして並べ替え、並べ替えられたアイテムを JSON 配列にダンプするリストを通過させることが難しくなります。JSONArray から各要素の共通の型を取得する唯一の確実な方法は、Object get() メソッドを使用することです..もちろん、あなたが持っているのは Object オブジェクトだけであり、それらを再訪せずに意味のある並べ替えを行うことはできません.シリアライズの問題。

JSONArray に均一に構造化された値が含まれていると仮定すると、JSONArray を反復処理し、型指定された get() メソッドの 1 つを呼び出して、それらを List 型にダンプし、それを並べ替えることができます。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-15T19:55:18.927 に答える
9

Android リスト 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-31T20:47:33.283 に答える
7

明確にするために、並べ替えコンパレータの上記のコードは正しくありません。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);
    }
});
于 2012-10-24T19:31:08.273 に答える
1

に含まれるデータを表示する場合JSONArrayは、アダプター自体で並べ替えることが理にかなっている場合があります。たとえば、クラスには、、 、もちろんArrayAdapter<T>などの必要なメソッドが既にあります。InsertRemoveSort

adapter.sort(new Comparator<JSONObject>(){

    @Override
    public int compare(JSONObject arg0, JSONObject arg1) {

        return arg0.optString("SortField", "").compareTo(arg1.optString("SortField","")) ;

    }

});
于 2015-08-25T20:54:33.003 に答える
1

フィールドのある例Date:

public class JsonObjectComparator implements Comparator<JSONObject> {
private final String fieldName;
private Class<? extends Comparable> fieldType;

public JsonObjectComparator(String fieldName, Class<? extends Comparable> fieldType) {
    this.fieldName = fieldName;
    this.fieldType = fieldType;
}    

@Override
public int compare(JSONObject a, JSONObject b) {
    String valA, valB;
    Comparable newInstance_valA, newInstance_valB;
    int comp = 0;
    try {
        Constructor<? extends Comparable> constructor = fieldType.getConstructor(String.class);            
        valA = a.getString(fieldName);
        valB = b.getString(fieldName);
        if (fieldType.equals(Date.class)) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
            newInstance_valA = dateFormat.parse(valA);            
            newInstance_valB = dateFormat.parse(valB);
        } else {
            newInstance_valA = constructor.newInstance(valA);            
            newInstance_valB = constructor.newInstance(valB);
        }
        comp = newInstance_valA.compareTo(newInstance_valB);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if(comp > 0)
        return 1;
    if(comp < 0)
        return -1;
    return 0;
  }

}

public static void main(String[] args) throws JSONException {        
    JSONObject o1 = new JSONObject();
    o1.put("key1", "26-06-2014");
    JSONObject o2 = new JSONObject();
    o2.put("key1", "30-11-2011");
    JSONObject o3 = new JSONObject();
    o3.put("key1", "15-07-2014");

    JsonObjectComparator comparator = new JsonObjectComparator("key1", Date.class);
    List<JSONObject> l = new ArrayList<>();
    l.add(o1);
    l.add(o2);
    l.add(o3);

    Collections.sort(l, comparator);
 }
于 2014-06-26T12:58:01.887 に答える
0
//My script
 //HEADER add final variables
    private final int TYPE_STRING = 1;
    private final int TYPE_INT = 2;
    private final int TYPE_DUBLE = 3;


//METHOD GET SORT JSONARRAY
public JSONArray  getSortJSONArray()
{
 JSONArray  json = new JSONArray  ([{"carid":"957502","vin":"XXXXX","carbrand":"CADILLAC","carmodel":"CTS","carname":"CADILLAC CTS седан CTS PERFORMANC 2.0L AWD AK4 2 4WD  AT-6 276 (Л.С.)","carmodificationname":" седан CTS PERFORMANC 2.0L AWD AK4 2 4WD  AT-6 276 (Л.С.)","carcolorname":"Opulent Blue Metallic - ярко-синий металлик","price":"3410000","rgb":"","volumereal":"2,00","power":"276"},{"carid":"957502","vin":"XXXXX","carbrand":"CADILLAC","carmodel":"CTS","carname":"CADILLAC CTS седан CTS PERFORMANC 2.0L AWD AK4 2 4WD  AT-6 276 (Л.С.)","carmodificationname":" седан CTS PERFORMANC 2.0L AWD AK4 2 4WD  AT-6 276 (Л.С.)","carcolorname":"Opulent Blue Metallic - ярко-синий металлик","price":"3460000","rgb":"","volumereal":"1,00","power":"272"}]");

 /*halper - My halper */
   JSONArray sorJsonArray = halper.sort(json, getComparator("power",TYPE_INT));
   return sorJsonArray;
}

private Comparator getComparator(final String tagJSON,final int type)
    {
        Comparator c =  new Comparator()
        {
            public int compare(Object a, Object b)
            {


                try
                {
                    JSONObject    ja = (JSONObject)a;
                    JSONObject    jb = (JSONObject)b;

                    switch (type)
                    {
                        case TYPE_STRING:// String
                          return ja.optString(tagJSON, "")
                                                .toLowerCase()
                                                .compareTo(jb.optString(tagJSON, "").toLowerCase());
                        case TYPE_INT:// int
                            int valA =  ja.getInt(tagJSON);
                            int valB =  jb.getInt(tagJSON);
                            if(valA > valB)
                                return 1;
                            if(valA < valB)
                                return -1;

                        case TYPE_DUBLE:// double
                            String v1 = ja.getString(tagJSON).replace(",",".");
                            String v2 = jb.getString(tagJSON).replace(",",".");

                            double valAd = new Double(v1);// ja.getDouble(tagJSON);
                            double valBd = new Double(v2);//  jb.getDouble(tagJSON);
                            if(valAd > valBd)
                                return 1;
                            if(valAd < valBd)
                                return -1;

                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                return 0;
            }
        };

        return c;
    }

//私の Halper クラス

public class Halpe {
    public void Halpe(){}

    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;
    }}
于 2016-06-02T13:59:56.133 に答える