【问题标题】:How to Sort an Arraylist of Date in ascending and descending order which is in String format如何按升序和降序对字符串格式的日期数组列表进行排序
【发布时间】:2014-12-03 19:19:58
【问题描述】:

我有字符串格式的日期数组列表,那么我该如何对这个数组列表进行排序,

ArrayList<String> aryBeginDate;
ArrayList<String> aryDueDate;

for (int i = 0; i < arySubject.size(); i++) {

    RowItem row = new RowItem();
    row.setSubject(arySubject.get(i).toString());
    row.setUser(aryFromUser.get(i).toString());

    if (aryBeginDate.equals(" ")) {
        row.setStartDate(" ");
    } else {
        row.setStartDate(aryBeginDate.get(i).toString()); \\Have to sort at this line
    }

    if (aryDueDate.equals(" ")) {
        row.setEndDate(" ");
    } else {
        row.setEndDate(aryDueDate.get(i).toString()); \\Have to sort at this line
    }

    aryListBean.add(row);

}

【问题讨论】:

标签: java android


【解决方案1】:

在需要日期时不要使用字符串。使用日期。您应该只在显示日期时将其转换为字符串。否则,在代码中的任何地方,日期都应该是 Date 类型。这就是允许按时间顺序排序的原因,因为日期具有按时间顺序排列的自然顺序。

因此,一旦RowItem 具有startDateendDate,两者都是Date 类型,您就可以使用简单的比较器按开始日期对行项目列表进行排序:

Collections.sort(rowItems, new Comparator<RowItem>() {
    @Override
    public int compare(RowItem r1, RowItem 2) {
        return r1.getStartDate().compareTo(r2.getStartDate());
    }
}); 

另外,修复 if/else 块的缩进,因为你的方式真的不可读:

if (aryBeginDate.equals(" ")) {
    row.setStartDate(" ");
} 
else {
    row.setStartDate(aryBeginDate.get(i).toString());
}

【讨论】:

  • 你好...如果两个日期相同我们该怎么办:)
  • 那么compareTo方法会返回0,这两个行项的顺序是不确定的。如果你想定义它,那么如果第一个比较返回 0,则根据另一个标准比较两个对象。
  • 如果我最晚日期在前怎么办?
  • @Chetu 你会使用r2.getStartDate().compareTo(r1.getStartDate()),或-r1.getStartDate().compareTo(r2.getStartDate())
  • 附注:最好也检查一下日期是否为null,否则很容易得到NPE .
【解决方案2】:

非常简单的答案:对于升序,只需调用此方法:

Collections.sort(mArrayList, new OutcomeAscComparator());
public class OutcomeAscComparator implements Comparator<Select>
    {
        public int compare(Select left, Select right) {
            return left.getOutcome().compareTo(right.getOutcome());
        }
    }

选择是我的模型,降序:

Collections.sort(mArrayList, new OutcomeDescComparator());
public class OutcomeDescComparator implements Comparator<Select>
    {
        public int compare(Select left, Select right) {
            return right.getOutcome().compareTo(left.getOutcome());
        }
    }

如果您希望列表为升序和降序,请不要忘记刷新列表视图

                mListView.invalidateViews();

                mAdapter.notifyDataSetChanged();

【讨论】:

    【解决方案3】:

    如果您尝试自己使用字符串进行排序,这将非常痛苦。我建议您将字符串解析为日期(查看 JodaTime 以获得非常方便的日期/时间工具),然后使用 java.util.Collections.sort() 进行排序。

    【讨论】:

    • 我已经感到痛苦 :) 我必须更改很多东西才能将 String 解析为 Date..plz 帮助我..我卡在我的项目中
    【解决方案4】:

    您可以使用Comparator 对列表进行排序。像这样的:

    Collections.sort(aryListBean, new Comparator<RowItem>() {
        @Override
        public int compare(RowItem r1, RowItem r2) {
            // Place your compare logic here
        }
    });
    

    【讨论】:

      【解决方案5】:

      ArrayList sort() 上有一个内置函数。由于您使用的是字符串,这将起作用。

      【讨论】:

      • 但它只会按字母排序字符串,而不是日期,我猜他想对日期进行排序。
      • 数字也被视为字符串。当您将它们作为字符串排序时,1 总是在 2 之前。
      • 你能给我一个例子吗??
      • 先评论Collections.sort(arr);并运行,然后取消评论并运行。你会看到区别:public static void main(String[] args) { ArrayList&lt;String&gt; arr=new ArrayList&lt;String&gt;(); arr.add("12-12-12"); arr.add("11-12-12"); arr.add("09-12-12"); Collections.sort(arr); System.out.println(arr); }
      【解决方案6】:

      首先转换Date中的String并创建arraylist。然后使用Collection排序方法对arraylist进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-18
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-03-24
        • 1970-01-01
        • 2020-11-09
        相关资源
        最近更新 更多