如何使用Java从JSONArray删除重复对象和排序对象 [英] How to remove duplicate and sort objects from JSONArray using Java

查看:43
本文介绍了如何使用Java从JSONArray删除重复对象和排序对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的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,但是这样的过程会太多.任何专门用于排序的快捷方式.

I want it to sort according to distance and remove duplicate stationCode. I tried using simple if else but that process will be too much.. any shortcut for same specially for sorting.

推荐答案

我前一段时间写了这个实用程序,它对JSONObjects中的JSONArray进行了排序 唯一的条件是您的JSONobjects必须包含您要基于sortkeys(如果要基于多个键进行排序,它还接受一组键)

I wrote this utility a while ago, it sorts a JSONArray of JSONObjects Only condition is that your JSONobjects must contain the keys you want to sort based on (it also accept a set of keys if you want to sort based on several 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());
    }
}

现在,如果您要删除重复项,可以iterate通过它们

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

这篇关于如何使用Java从JSONArray删除重复对象和排序对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆