How to remove duplicates and sort objects from JSONArray using Java

My 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" } ] 

I want it to sort by distance and delete the duplicate stationCode. I tried using a simple if else, but this process will be too ... any shortcut for the same as for sorting.

+5
source share
2 answers

I wrote this utility some time ago, it sorts a JSONArray from JSONObjects only condition is that your JSONObjects must contain the keys on which you want sort based (it also accepts a set of keys if you want to sort based on multiple keys)

 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()); } } 

Now, if you want to remove duplicates, you can iterate through them

 Set<String> stationCodes=new HashSet<String>(); JSONArray tempArray=new JSONArray(); for(int i=0;i<yourJSONArray.size();i++){ String stationCode=yourJSONArray.getJSONObject(i).getString("stationCode"); if(stationsCodes.contains(stationCode){ continue; } else{ stationsCodes.add(stationCode); tempArray.add(yourJSONArray.getJSONObject(i)); } } yourJSONArray= tempArray; //assign temp to original //here how you can sort it using utility above: JSONArraySort.sortASCE(yourJSONArray,"distance"); 
+3
source

There is no direct way to do this, but you can follow the directions below:

  • Convert JsonObject to a list of Java objects using org.codehaus.jackson.map.ObjectMapper

  • Use a Java map to create a unique object (put key = stationCode, javaObject as an object)

  • Sort map data based on distance.

+1
source

All Articles