jsonArrayでフィールドでソート

14081 ワード

いくつかのビジネスシーンでは、json配列のフィールドサイズでソートする必要があります.たとえば、このjson配列
{
    "name":"  ",
    "num":3,
    "sites": [
        { "name":"Google", "info":[ "Android", "Google   ", "Google   " ] },
        { "name":"Runoob", "info":[ "    ", "    ", "    " ] },
        { "name":"Taobao", "info":[ "  ", "  " ] }
    ]
}

現在、ビジネスではjson配列sitesのnameフィールドに基づいてソートする必要があります.どうすればいいですか?
    /**
     *  json    ,
     * @param jsonArr
     * @param sortKey      
     * @param is_desc is_desc-false     is_desc-true   (        )
     * @return
     */
    public static String jsonArraySort(JSONArray jsonArr,String sortKey,boolean is_desc) {
        //      json  
        JSONArray sortedJsonArray = new JSONArray();
        //     list
        List<JSONObject> jsonValues = new ArrayList<JSONObject>();
        //   json       ,  list
        for (int i = 0; i < jsonArr.size(); i++) {
            jsonValues.add(JSONObject.fromObject(jsonArr.getJSONObject(i)));
        }
        //    ,  compare  ,         ,    
        Collections.sort(jsonValues, new Comparator<JSONObject>() {
            //    
            private  final String KEY_NAME = sortKey;
            //  compare  
            @Override
            public int compare(JSONObject a, JSONObject b) {
                String valA = new String();
                String valB = new String();
                try {
                    valA = a.getString(KEY_NAME);
                    valB = b.getString(KEY_NAME);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                //       
                if (is_desc){
                    return -valA.compareTo(valB);
                } else {
                    return -valB.compareTo(valA);
                }

            }
        });
        //          jsonArray
        for (int i = 0; i < jsonArr.size(); i++) {
            sortedJsonArray.add(jsonValues.get(i));
        }
        return sortedJsonArray.toString();
    }

補足:
Javaには2つのコンパレータがあります
  • java.lang.Comparableインタフェース
    public interface Comparable<T> {
        public int compareTo(T o);
    }
    
  • java.util.Comparatorインタフェース
     public interface Comparator<T> {
         int compare(T o1, T o2);
         //  ...........
     }
    
  • 2つの比較器の違い:
  • java.lang.Comparableは、外部オブジェクトと現在のオブジェクトthisの比較
        this  <  obj   ----     
        this  =  obj   ----    0
        this  >  obj   ----     
    
  • という内部比較をサポートします.
  • java.util.Comparatorは、外部比較とは何か、すなわち2つの外部オブジェクトの比較をサポートする外部比較をサポートし、現在のオブジェクトとの比較をサポートしない
        o1  <  o2   ----     
        o1  =  o2   ----    0
        o1  >  o2   ----