简体   繁体   English

Android:在JSON数据中按日期排序

[英]Android: sort by date in the JSON data

I am new to Android. 我是Android新手。 I'm trying to sort by the date in the JSON data, but nothing works. 我正在尝试按JSON数据中的日期排序,但是没有任何效果。 I'm not even getting an error. 我什至没有出错。 I've tried so many different ways, but its not working. 我尝试了很多不同的方法,但是没有用。

I did a lot of searching but could not figure out how to implement this. 我做了很多搜索,但不知道如何实现。 How can I sort this by the days column? 如何按天数列排序? Thank you in advance. 先感谢您。

Here's my code 这是我的代码

public class ParseJSONTask  extends AsyncTask< Void , Void , Void > {
public Handler handler = new Handler();
public Activity act = null;
private  static String TAG_SERVICES = "services";
private static String TAG_ID = "id";
private static String TAG_COMMAND = "command";
private static String TAG_DAYS = "days";
private static String TAG_HOURS = "hours";
private static String TAG_OSMS = "osms";
private static String TAG_ISMS = "isms";
private static String TAG_TIMEOUT = "timeout";
public String SMS_SENT = "SMS Gönderildi";
public String SMS_DELIVERED = "SMS İletildi";
public String serviceString = "";

ArrayList<ServiceData> services;

    @Override
    public void onPreExecute() {
        super.onPreExecute();
        services = new ArrayList<ServiceData>();


    }
    @Override
    public Void doInBackground(Void... params) {


        WebServiceHandler webServiceHandler = new WebServiceHandler();
        String JsonStr = webServiceHandler.getJSONData("http://jsonblob.com/55e34310e4b01190df36e861");

        try {

            JSONObject jsonObject = new JSONObject(JsonStr);
            final JSONArray contactsJSON = jsonObject.getJSONArray(TAG_SERVICES);

            for (int i = 0; i < contactsJSON.length(); i++) {

                ServiceData aServiceData = new ServiceData();


                //json parse  istedimiz veriyi kullanabiliriz.
                JSONObject serviceObject = contactsJSON.getJSONObject(i);

                aServiceData.id = serviceObject.getString(TAG_ID);

                aServiceData.command = serviceObject.getString(TAG_COMMAND);

                aServiceData.days = serviceObject.getString(TAG_DAYS);

                aServiceData.hours = serviceObject.getString(TAG_HOURS);

                aServiceData.osms = serviceObject.getString(TAG_OSMS);

                aServiceData.isms = serviceObject.getString(TAG_ISMS);

                aServiceData.timeout = serviceObject.getString(TAG_TIMEOUT);


                String input = aServiceData.days + " " + aServiceData.hours;
                Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(input);
                long milliseconds = date.getTime();
                final long millisecondsFromNow = milliseconds - (new Date()).getTime();
                aServiceData.milliseconds = milliseconds;
                services.add(aServiceData);

                if(millisecondsFromNow > 0) {
                    new DateSendSMS().onCreate(aServiceData.days, aServiceData.hours, aServiceData.osms, aServiceData.command);
                    Thread.sleep(Integer.parseInt(aServiceData.timeout) * 60000);
                }

                //Timeout aşağı kısımda sürelendirilecek


            }


        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        String serviceString = "";
        for (ServiceData aServiceData:services){
            serviceString+=aServiceData.toString();
        }
        Collections.sort(services, new Comparator<ServiceData>() {
            @Override
            public int compare(ServiceData t1, ServiceData t2) {
                return t1.milliseconds <= t2.milliseconds ? -1 : 1;
            }
        });

        // here is sorted data
        for (ServiceData aServiceData : services) {

            // move DateSendSMS here. above you can add additional logic about millis
            new DateSendSMS().onCreate(aServiceData.days, aServiceData.hours, aServiceData.osms, aServiceData.command);
            Log.d("+++++", aServiceData.toString());
        }
    }
}

ServiceData Class: ServiceData类:

public static class ServiceData {
    public long milliseconds;
    public String id = "";
    public String command = "";
    public String days = "";
    public String hours = "";
    public String osms = "";
    public String isms = "";
    public String timeout = "";
    @Override
    public String toString() {
        return id + ",  " + command + ",  " + days + ",  " + hours + ",  " + osms + ",  " + isms
                + ",  " + timeout + "\n \n  ";
    }
}

Add time field to ServiceData class 将时间字段添加到ServiceData

ServiceDate {
   ...
   long milliseconds;
   ...
}

Fill this field in for loop: 在for循环中填写此字段:

long milliseconds = date.getTime();
aServiceData.milliseconds = milliseconds;

Sort services in onPostExecute onPostExecuteservices进行onPostExecute

Collections.sort(services, new Comparator<ServiceData>() {
    @Override
    public int compare(ServiceData t1, ServiceData t2) {
        return t1.milliseconds <= t2.milliseconds ? -1 : 1;
    }
});

I am not sure you can directly sort Json Data (I dont know weather there is a library that will actually do it - if so go for it). 我不确定您可以直接对Json数据进行排序(我不知道有没有一个图书馆可以真正做到这一点-如果可以的话)。 I Suggest you to put all the ServiceData into a collection (Which you do at the moment) and then Sort it. 我建议您将所有ServiceData放入一个集合中(此刻您要这样做),然后对其进行排序。

You can write your own sorting algorithm or you can use a Java Collections library to do the sorting by implimention Comparable on your ServiceData class or using a Comparable and them you can use Colletions.sort() to sort your list. 您可以编写自己的排序算法,也可以使用Java Collections library在ServiceData类上使用Colletions.sort() Comparable或使用Comparable进行排序,并且可以使用Colletions.sort()对列表进行排序。

Here is a good tutorial. 是一个很好的教程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM