【问题标题】:Android: sort by date in the JSON dataAndroid:按 JSON 数据中的日期排序
【发布时间】:2015-08-30 17:43:41
【问题描述】:

我是 Android 新手。我正在尝试按 JSON 数据中的日期排序,但没有任何效果。我什至没有收到错误。我尝试了很多不同的方法,但都不起作用。

我做了很多搜索,但无法弄清楚如何实现这一点。如何按天列对此进行排序?提前谢谢你。

这是我的代码

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 类:

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

【问题讨论】:

  • 在解析和格式化日期后尝试放入任何 Collection,如 List 或 Arraylist,然后应用 Collection.sort()。
  • 是的,我理解这种方式的逻辑,但是当我申请时它不会改变结果
  • 我更新了您的代码以记录排序数据。现在开始任务,并检查结果。 // here is sorted data in onPostExecute
  • @UmutADALI 所以,你满意吗?
  • @StasParshin 是的,谢谢

标签: android sorting date parsing android-asynctask


【解决方案1】:

ServiceData类添加时间字段

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

在for循环中填写该字段:

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

onPostExecute中排序services

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

【讨论】:

  • 真的吗?它是按其他方式排序还是完全未排序?
  • @Diode 这对我来说也很有趣,但你可以解决这个问题:) 我看到你的回答也被否决了。有人生气了
  • 我是新的,所以投票不能使用投票:) 我之前尝试过类似的东西,没有任何改变。我想我在某个地方犯了一个错误
  • @UmutADALI 您是否在 for 循环中添加了 aServiceData.milliseconds = milliseconds;?通过问题编辑向您发布新代码
  • @UmutADALI 是的,我检查过,出色的排序数据。我添加了登录您的onPostExecute。自行检查,数据按日期排序
【解决方案2】:

我不确定您是否可以直接对 Json 数据进行排序(我不知道天气是否有一个库可以真正做到这一点 - 如果是这样的话)。我建议您将所有ServiceData 放入一个集合中(您目前正在这样做),然后对其进行排序。

您可以编写自己的排序算法,也可以使用 Java Collections library 通过在 ServiceData 类上实现 Comparable 或使用 Comparable 进行排序,您可以使用 Colletions.sort() 对列表进行排序。

Here 是一个很好的教程。

【讨论】:

  • 我之前检查过这个教程,但不知何故不适用于我的代码
  • @UmutADALI 嘿,我在代码中看到了您的排序,
  • 因为它不起作用。我刚开始,所以我不确定我是否做了正确的删除
  • @UmutADALI 粘贴您的 ServiceData 类
  • 我添加了 ServiceData 类。
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多