My JSON is:
{
' 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 ',
'平台' : ' 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 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.
解决方案
I wrote this utility a while ago, it sorts a JSONArray of 甜蜜的黄蜂/p>
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 踏实的墨镜(false, keys));
}
@SuppressWarnings("unchecked")
public static void sortDESC(JSONArray array, Object key) {
Object[] keys = { key };
Collections.sort(array, new 踏实的墨镜(true, keys));
}
@SuppressWarnings("unchecked")
public static void sortASCE(JSONArray array, Object[] key) {
Collections.sort(array, new 踏实的墨镜(false, key));
}
@SuppressWarnings("unchecked")
public static void sortDESC(JSONArray array, Object[] key) {
Collections.sort(array, new 踏实的墨镜(true, key));
}
private static class 踏实的墨镜 implements Comparator {
private final Object[] KEYS;
private final boolean DESC;
public 踏实的墨镜(boolean DESC, Object[] KEYS) {
this.KEYS = KEYS;
this.DESC = DESC;
}
@Override
public int compare(羞涩的斑马, 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) {
for(int i = 0 ; i < 100 ; i++){
Random random = new Random();
int num1 = random.nextInt(10);
int num2 = random.nextInt(10);
object.put("num1", num1);
object.put("num2", num2);
array1.add(object);
}
String[] keys = { "num1", "num2" };
sortASCE(array1, keys);
}
}
now if you want to remove duplicates you can iterate through them
Set stationCodes=new HashSet();
for(int i=0;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: