2015-09-03 7 views
5

Meine ist:Wie Duplikat zu entfernen und Objekte aus JSONArray sortiert JSON mit Java

[ 
    { 
     "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" 
    } 
] 

ich es nach Entfernung sortiert werden soll und doppelten stationCode zu entfernen. Ich habe versucht, mit einfachen, wenn sonst, aber dieser Prozess wird zu viel .. eine Abkürzung für das gleiche speziell zum Sortieren.

+0

Veröffentlichen Sie den Code, den Sie versucht haben und was sind Ihre Fehler :) So wird es einfacher für Sie zu lernen und für uns zu helfen! –

Antwort

3

Ich schrieb dieses Dienstprogramm eine Weile her, es ist ein JSONArray von JSONObjects Einzige Bedingung sortiert ist, dass Ihre JSONobjects muss enthalten die keys Sie sort wollen basierend auf (es auch eine Reihe von Tasten annehmen, wenn Sie möchten, Art basiert auf mehreren Tasten)

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

jetzt, wenn Sie Duplikate entfernen möchten, können Sie iterate durch sie

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"); 
+0

Danke, es funktionierte für das Sortieren .. Filterung duplizierte es mit meiner anderen Logik :) Gespeichert viel Zeit mit diesem Sortieren Sache :) –

+0

@GovindMantri, cool Kumpel, nur du kennst dich kann DECS mit mehr als einem Schlüssel sortieren. – nafas

1

Es gibt keine direkte Möglichkeit zu, dass aber die Art und Weise unten genannten folgen:

  1. Trans JsonObject auf Java Objektliste mit org.codehaus.jackson.map.ObjectMapper

  2. Verwenden Sie ein Java Map um eindeutig zu machen (put key = stationCode, javaObject als Objekt)

  3. Sortieren Sie die Kartendaten basierend auf der Entfernung.

+0

sicher gibt es einen direkten Weg der Sortierung :) – nafas

Verwandte Themen