【问题标题】:How to Sort Date in descending order From Arraylist Date in android?如何从android中的Arraylist Date按降序对日期进行排序?
【发布时间】:2012-10-18 16:33:39
【问题描述】:

我有一个ArrayList,它存储Dates,我按降序对它们进行了排序。现在我想在ListView 中显示它们。这是我到目前为止所做的:

 spndata.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {

                switch (position) {
                case 0:
                    list = DBAdpter.requestUserData(assosiatetoken);
                    for (int i = 0; i < list.size(); i++) {
                        if (list.get(i).lastModifiedDate != null) {
                            lv.setAdapter(new MyListAdapter(
                                    getApplicationContext(), list));
                        }
                    }
                    break;
                case 1:
                    list = DBAdpter.requestUserData(assosiatetoken);

                    Calendar c = Calendar.getInstance();
                    SimpleDateFormat df3 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");    
                    String formattedDate3 = df3.format(c.getTime());                        
                    Log.v("log_tag", "Date  " + formattedDate3);

                    for (int i = 0; i < list.size(); i++) {                         
                        if (list.get(i).submitDate != null) {                               
                            String sDate = list.get(i).submitDate;                              
                            SimpleDateFormat df4 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");    
                            String formattedDate4 = df4.format(sDate);

                            Map<Date, Integer> dateMap = new TreeMap<Date, Integer>(new Comparator<Date>(){  
                                 public int compare(Date formattedDate3, Date formattedDate4) {
                                     return formattedDate3.compareTo(formattedDate4);
                                 }
                            });
                            lv.setAdapter(new MyListAdapter(
                                    getApplicationContext(), list));
                        }
                    }
                    break;
                case 2:

                    break;

                case 3:

                    break;

                default:
                    break;
                }

            }

            public void onNothingSelected(AdapterView<?> arg0) {
            }

        });

【问题讨论】:

  • 对于新读者来说,考虑扔掉早已过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。

标签: java android date arraylist sortedlist


【解决方案1】:

上述答案的更简单替代方法

  1. 如果 Object(Model Class/POJO) 包含 date in String 数据类型。

    private void sortArray(ArrayList<myObject> arraylist) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); //your own date format
    if (reports != null) {
        Collections.sort(arraylist, new Comparator<myObject>() {
            @Override
            public int compare(myObject o1, myObject o2) {
                try {
                    return simpleDateFormat.parse(o2.getCreated_at()).compareTo(simpleDateFormat.parse(o1.getCreated_at()));
                } catch (ParseException e) {
                    e.printStackTrace();
                    return 0;
                }
            }
        });
    }
    
  2. 如果对象(模型类/POJO)包含日期中的日期数据类型

    private void sortArray(ArrayList<myObject> arrayList) {
    if (arrayList != null) {
        Collections.sort(arrayList, new Comparator<myObject>() {
            @Override
            public int compare(myObject o1, myObject o2) {
                return o2.getCreated_at().compareTo(o1.getCreated_at()); }
        });
    } }
    

以上代码用于按日期的降序对数组进行排序, 将 o1 和 o2 交换为升序

【讨论】:

    【解决方案2】:

    如果字符串格式的日期将其转换为每个对象的日期格式:

    String argmodifiledDate = "2014-04-06 22:26:15";
    SimpleDateFormat  format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                try
                {
                    this.modifiledDate = format.parse(argmodifiledDate);
                }
                catch (ParseException e)
                {
    
                    e.printStackTrace();
                }
    

    然后对arraylist进行降序排序:

    ArrayList<Document> lstDocument= this.objDocument.getArlstDocuments();
            Collections.sort(lstDocument, new Comparator<Document>() {
                  public int compare(Document o1, Document o2) {
                      if (o1.getModifiledDate() == null || o2.getModifiledDate() == null)
                        return 0;     
                      return o2.getModifiledDate().compareTo(o1.getModifiledDate());
                  }
                });
    

    【讨论】:

      【解决方案3】:

      创建日期类的Arraylist&lt;Date&gt;。并使用Collections.sort() 进行升序。

      sort(List<T> list)

      根据其元素的自然顺序将指定列表按升序排序。

      降序排序见Collections.reverseOrder()

      Collections.sort(yourList, Collections.reverseOrder());
      

      【讨论】:

      • 默认Collection.sort按降序排序
      • @ArslanAhmad 看到上面的答案,或者去 javadoc 了解更多细节。
      • 这行得通@SumitSingh...不知道为什么它被否决了!
      【解决方案4】:

      您使用的日期的 compareTo() 将适用于升序。

      要进行降序,只需反转 compareTo() 出来的值。您可以使用单个 Comparator 类,该类在标识排序顺序的构造函数中接受标志/枚举

      public int compare(MyObject lhs, MyObject rhs) {
      
          if(SortDirection.Ascending == m_sortDirection) {
              return lhs.MyDateTime.compareTo(rhs.MyDateTime);
          }
      
          return rhs.MyDateTime.compareTo(lhs.MyDateTime);
      }
      

      您需要调用Collections.sort() 才能对列表进行实际排序。

      附带说明,我不确定您为什么要在 for 循环中定义地图。我不确定您的代码要做什么,但我假设您想将 for 循环中的索引值填充到地图中。

      【讨论】:

      • “!”方法不起作用,因为 compareTo 返回一个 int,要反转值,要么更改对象的顺序,要么使用:Collections.sort(list, Collections.reverseOrder(comparator));
      • @ricvieira 好点!我已经修改了我的答案,包括在 compare() 方法中颠倒顺序
      【解决方案5】:

      在情况1中添加这样的:像这样

       case 0:
           list = DBAdpter.requestUserData(assosiatetoken);
           Collections.sort(list, byDate);
           for (int i = 0; i < list.size(); i++) {
               if (list.get(i).lastModifiedDate != null) {
                   lv.setAdapter(new MyListAdapter(
                           getApplicationContext(), list));
               }
           }
           break;
      

      并将此方法放在课程的末尾

      static final Comparator<All_Request_data_dto> byDate = new Comparator<All_Request_data_dto>() {
          SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
      
          public int compare(All_Request_data_dto ord1, All_Request_data_dto ord2) {
              Date d1 = null;
              Date d2 = null;
              try {
                  d1 = sdf.parse(ord1.lastModifiedDate);
                  d2 = sdf.parse(ord2.lastModifiedDate);
              } catch (ParseException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
      
      
              return (d1.getTime() > d2.getTime() ? -1 : 1);     //descending
          //  return (d1.getTime() > d2.getTime() ? 1 : -1);     //ascending
          }
      };
      

      【讨论】:

      • 导入这些包 import java.util.Collections;导入 java.util.Date;
      • Collections 类型的泛型方法 sort(List) 不适用于参数 (ArrayList)。
      • 推断类型 All_Request_data_dto 不是有界参数 >
      • 请等待 1 分钟,请将您的 DTO 课程放在这里
      • 公共类 All_Request_data_dto { String requestId;字符串项目ID;字符串表ID;字符串项目名称;字符串显示ID;字符串问题 ID;字符串标题;字符串状态;字符串最后修改日期;字符串最后修饰符;字符串 lastStateChanger;字符串所有者;字符串提交日期;字符串提交者;字符串排序提交日期; }
      【解决方案6】:

      DateComparable,所以只需创建List&lt;Date&gt; 的列表并使用Collections.sort() 对其进行排序。并使用Collections.reverseOrder() 获取reverse ordering 中的比较器。

      来自 Java 文档

      返回一个比较器,它强制指定比较器的反向排序。如果指定的比较器为 null,则此方法等效于 reverseOrder()(换句话说,它返回一个比较器,该比较器将自然排序的反向强加于实现 Comparable 接口的对象集合)。

      【讨论】:

        猜你喜欢
        • 2017-12-16
        • 2011-08-19
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 2013-09-10
        • 2011-08-12
        • 2016-10-15
        • 1970-01-01
        相关资源
        最近更新 更多