如何使用Java

时间:2015-09-03 08:58:40

标签: java json sorting

我的JSON是:

[
   {
      "distance":32,
      "stationCode":"MIG",
      "name":"Midghat",
      "platforms":"2"
   },
   {
      "distance":32,
      "stationCode":"MIG",
      "name":"Midghat",
      "platforms":"2"
   },
   {
      "distance":69,
      "stationCode":"MDDP",
      "name":"Mandideep",
      "platforms":"2"
   },
   {
      "distance":69,
      "stationCode":"MDDP",
      "name":"Mandideep",
      "platforms":"2"
   },
   {
      "distance":18,
      "stationCode":"HBD",
      "name":"Hoshangabad",
      "platforms":"2"
   },
   {
      "distance":18,
      "stationCode":"HBD",
      "name":"Hoshangabad",
      "platforms":"2"
   },
   {
      "distance":37,
      "stationCode":"CHQ",
      "name":"Choka",
      "platforms":"2"
   },
   {
      "distance":37,
      "stationCode":"CHQ",
      "name":"Choka",
      "platforms":"2"
   },
   {
      "distance":85,
      "stationCode":"HBJ",
      "name":"Habibganj",
      "platforms":"5"
   },
   {
      "distance":85,
      "stationCode":"HBJ",
      "name":"Habibganj",
      "platforms":"5"
   },
   {
      "distance":0,
      "stationCode":"ET",
      "name":"ItarsiJn",
      "platforms":"28"
   },
   {
      "distance":8,
      "stationCode":"PRKD",
      "name":"Powerkheda",
      "platforms":"2"
   },
   {
      "distance":8,
      "stationCode":"PRKD",
      "name":"Powerkheda",
      "platforms":"2"
   },
   {
      "distance":55,
      "stationCode":"ODG",
      "name":"ObaidullaGanj",
      "platforms":"2"
   },
   {
      "distance":55,
      "stationCode":"ODG",
      "name":"ObaidullaGanj",
      "platforms":"2"
   },
   {
      "distance":44,
      "stationCode":"BKA",
      "name":"Barkhera",
      "platforms":"2"
   },
   {
      "distance":44,
      "stationCode":"BKA",
      "name":"Barkhera",
      "platforms":"2"
   },
   {
      "distance":79,
      "stationCode":"MSO",
      "name":"Misrod",
      "platforms":"2"
   },
   {
      "distance":79,
      "stationCode":"MSO",
      "name":"Misrod",
      "platforms":"2"
   },
   {
      "distance":25,
      "stationCode":"BNI",
      "name":"Budni",
      "platforms":"2"
   },
   {
      "distance":25,
      "stationCode":"BNI",
      "name":"Budni",
      "platforms":"2"
   },
   {
      "distance":91,
      "stationCode":"BPL",
      "name":"BhopalJn",
      "platforms":"6"
   },
   {
      "distance":63,
      "stationCode":"ITKL",
      "name":"ItayaKalan",
      "platforms":"2"
   },
   {
      "distance":63,
      "stationCode":"ITKL",
      "name":"ItayaKalan",
      "platforms":"2"
   }
]

我希望它根据距离排序并删除重复的stationCode。我尝试使用简单的if else但是这个过程太多了......任何专门用于排序的快捷方式。

3 个答案:

答案 0 :(得分:3)

我刚才写了这个实用程序,它对JSONArray JSONObjects进行排序 唯一的条件是您的JSONobjects必须包含您想要keys的{​​{1}}(如果您想根据多个键进行排序,它还会接受一组键)

sort

现在,如果你想删除重复项,可以import java.util.Collections; import java.util.Comparator; import java.util.Random; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class JSONArraySort { @SuppressWarnings("unchecked") public static void sortASCE(JSONArray array, Object key) { Object[] keys = { key }; Collections.sort(array, new JSONArrayComparator(false, keys)); } @SuppressWarnings("unchecked") public static void sortDESC(JSONArray array, Object key) { Object[] keys = { key }; Collections.sort(array, new JSONArrayComparator(true, keys)); } @SuppressWarnings("unchecked") public static void sortASCE(JSONArray array, Object[] key) { Collections.sort(array, new JSONArrayComparator(false, key)); } @SuppressWarnings("unchecked") public static void sortDESC(JSONArray array, Object[] key) { Collections.sort(array, new JSONArrayComparator(true, key)); } private static class JSONArrayComparator implements Comparator<JSONObject> { private final Object[] KEYS; private final boolean DESC; public JSONArrayComparator(boolean DESC, Object[] KEYS) { this.KEYS = KEYS; this.DESC = DESC; } @Override public int compare(JSONObject object1, JSONObject object2) { int length = KEYS.length; for(int i = 0 ; i < length ; i++){ String KEY = KEYS[i].toString(); Object one = object1.get(KEY); Object two = object2.get(KEY); if(Number.class.isAssignableFrom(one.getClass()) && Number.class.isAssignableFrom(two.getClass())){ Double numOne = Number.class.cast(one).doubleValue(); Double numTwo = Number.class.cast(two).doubleValue(); int compared = 0; if(DESC){ compared = numTwo.compareTo(numOne); }else{ compared = numOne.compareTo(numTwo); } if(i == KEYS.length - 1 || compared != 0){ return compared; } }else{ int compared = 0; if(DESC){ compared = two.toString().compareTo(one.toString()); }else{ compared = one.toString().compareTo(two.toString()); } if(i == KEYS.length - 1 || compared != 0){ return compared; } } } // this shouldn't happen. return 0; } } //testing... public static void main(String... args) { JSONArray array1 = new JSONArray(); for(int i = 0 ; i < 100 ; i++){ Random random = new Random(); int num1 = random.nextInt(10); int num2 = random.nextInt(10); JSONObject object = new JSONObject(); object.put("num1", num1); object.put("num2", num2); array1.add(object); } String[] keys = { "num1", "num2" }; sortASCE(array1, keys); System.out.println(array1.toString()); } } 通过它们

iterate

答案 1 :(得分:1)

没有直接的方法,但你可以按照下面提到的方式:

  1. 使用org.codehaus.jackson.map.ObjectMapper将JsonObject转换为Java对象列表

  2. 使用Java Map使其唯一(put key = stationCode,javaObject as object)

  3. 根据距离对地图数据进行排序。

答案 2 :(得分:-1)

Here is the code for joining '2' JSONArrays and removing duplicates from the joined JSONArray, using ArrayList<String>..contains() method:

    import java.util.ArrayList;
    import java.util.List;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    /**
     * @author RAM K K
     * @gmail kkram523@gmail.com
     * 
     */

public class JSONOperations {

    public static void main(String[] args) {

        String s3;

        String s1 = "[{\"name\": \"Bob\", \"car\": \"Ford\"},{\"name\": \"Steve\", \"car\": \"Mercedes Benz\"},{\"name\": \"Bob\", \"car\": \"Ford\"},{\"name\": \"Bob\", \"car\": \"Ford\"},{\"name\": \"Bob\", \"car\": \"Ford\"},{\"name\": \"Bob\", \"car\": \"Ford\"},{\"name\": \"Mary\", \"car\": \"Fiat\"}]";
        String s2 = "[{\"name\": \"Mack\", \"car\": \"VW\"},{\"name\": \"Steve\", \"car\": \"Mercedes Benz\"},{\"name\": \"Bob\", \"car\": \"Ford\"}]";
        try {
            JSONArray sourceArray = new JSONArray(s2);
            JSONArray destinationArray = new JSONArray(s1);

            System.out.println(sourceArray);
            System.out.println(destinationArray);

            for (int i = 0; i < sourceArray.length(); i++) {
                destinationArray.put(sourceArray.getJSONObject(i));
            }

            System.out.println(destinationArray);
            System.out.println("JSONArray Size is: " + destinationArray.length());
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < destinationArray.length(); i++) {
                if (!list.contains(destinationArray.get(i).toString())) {
                    list.add(destinationArray.get(i).toString());
                }
            }

            System.out.println("LIST: " + list);
            System.out.println("LIST Size: " + list.size());

            JSONArray distinctJSONArray = new JSONArray(list.toString());
            System.out.println(distinctJSONArray.length());
            for (int i = 0; i < distinctJSONArray.length(); i++) {
                JSONObject JSON = (JSONObject) distinctJSONArray.getJSONObject(i);
                System.out.println(JSON);
            }

            s1 = s1.substring(s1.indexOf("[") + 1, s1.lastIndexOf("]"));
            s2 = s2.substring(s2.indexOf("[") + 1, s2.lastIndexOf("]"));

            s3 = "[" + s1 + "," + s2 + "]";
            System.out.println(new JSONArray(s3));

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}