对JSONObject中的数据进行排序

示例json字符串的格式如下:
{
     "data": {
     "sort": {
      "fields": [
        "open_px",
        "last_px",
        "high_px",
        "low_px"
      ],
      "603018.SS": [
        61.97,
        60.47,
        62.89,
        60.28
      ],
      "600990.SS": [
        62.8,
        59.99,
        62.88,
        59.36
      ],
      }
     }
    }
具体步骤:
JSONObject object  = new JSONObject(jsonStr);
		for (int i = 0; i < object.names().length(); i++) {
			JSONArray array = object.getJSONArray(object.names().getString(i));
			Double open_px = array.getDouble(0);
			Double last_px = array.getDouble(1);
			Double high_px = array.getDouble(2);
			Double low_px = array.getDouble(3);
			Entity entity = new Entity(open_px,last_px,high_px,low_px);
			mList.add(entity);
		}
		SortComparator comparator = new SortComparator();
		Collections.sort(mList, comparator);

对于此JSONObject,开始我还并不知道如何解析,后来查了源代码才发现,JSONObject对象其实存在一个names()方法,通过此方法,可以获取到JSONObject中的key值,我们再通过key值即可获取JSONArray中的数据。具体步骤:

先创建一个ArrayList,用于保存Entity

private ArrayList mList = new ArrayList();
代码:
JSONObject object  = new JSONObject(jsonStr);
        for (int i = 0; i < object.names().length(); i++) {
            JSONArray array = object.getJSONArray(object.names().getString(i));
            Double open_px = array.getDouble(0);
            Double last_px = array.getDouble(1);
            Double high_px = array.getDouble(2);
            Double low_px = array.getDouble(3);
            Entity entity = new Entity(open_px,last_px,high_px,low_px);
            mList.add(entity);
        }
        SortComparator comparator = new SortComparator();
        Collections.sort(mList, comparator);
由于JSONObject的存储数据的方式与HashMap是一样的,也就是说,通过此方法,我们取出来的数据它是不规则的,而如果想要得到一个按某个特定的规则来排序,则需要实现Comparator接口
class SortComparator implements Comparator{
        @Override
        public int compare(Object lhs, Object rhs) {
            // TODO Auto-generated method stub
            Entity entity1 = (Entity) lhs;
            Entity entity2 = (Entity) rhs;
            return (int)(entity2.getLast_px()-entity1.getLast_px());
        }    
    }
注:这里当中的Entity即为实体,用于存储我们所获取的值,通过其中的某个值去定义自己的规则,然后排序。另外,需注意,当compare()返回为0时,无法进行排序。所以这也就涉及到一个问题,在实际的开发中,我们会发现,服务器返回的数据有很多相近或相同的数据,那么他们就无法做到真正意义上的排序,因为我们知道,当compare()返回0的时候,二者之间是无法排序的,那么就要对程序做相应的修改。
class SortComparator implements Comparator{
        @Override
        public int compare(Object lhs, Object rhs) {
            // TODO Auto-generated method stub
            Entity entity1 = (Entity) lhs;
            Entity entity2 = (Entity) rhs;
            if(entity2.getLast_px()-entity1.getLast_px()>=0){
                return 1;
            }else {
                return -1;
            }
        }
    }
通过上面的方式修改,我们发现,不让其返回为0的情况,即可完成所有的排序。这样也就达到了我们的要求。至此,JSONObject的排序完成。

你可能感兴趣的:(Android开发笔记)