2015-09-03 18 views
5

Moje JSON jest:Jak usunąć duplikaty i sortować obiekty z JSONArray użyciu 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" 
    } 
] 

chcę go do sortowania według odległości i usunąć duplikaty stationCode. Próbowałem użyć prostego, jeśli nie, ale ten proces będzie zbyt duży. Każdy skrót będzie taki sam, jak w przypadku sortowania.

+0

Opublikuj kod, który wypróbowałeś i jakie są twoje błędy :) W ten sposób łatwiej Ci będzie się uczyć, a nam pomóc! –

Odpowiedz

3

Napisałem ten program jakiś czas temu, że sortuje JSONArray z JSONObjects Jedynym warunkiem jest to, że JSONobjects musi zawierać keys chcesz sort oparciu o (również przyjąć zestaw kluczy, jeśli chcesz porządek oparty na kilku klawiszy)

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

teraz, jeśli chcesz usunąć duplikaty możesz iterate przez nich

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

Dzięki to działało na sortowanie .. filtrowanie duplikatu zrobiło to z moją inną logiką :) Zapisałem dużo czasu z tym sortowaniem :) –

+0

@GovindMantri, fajny kolego, po prostu znasz cię może sortować DECS za pomocą więcej niż jednego klucza. – nafas

1

Nie ma bezpośredni sposób do tego, ale można iść drogą wymienione poniżej:

  1. Transform JSONObject do listy obiektów Javy za pomocą org.codehaus.jackson.map.ObjectMapper

  2. użyć Java Map, aby uczynić unikalnym (put key = stationCode, javaObject jako obiekt)

  3. Sortuj dane mapy na podstawie odległości.

+0

z pewnością istnieje bezpośredni sposób sortowania :) – nafas

Powiązane problemy