【问题标题】:Sort Arraylist With Times [duplicate]按时间排序 Arraylist [重复]
【发布时间】:2017-10-06 11:06:24
【问题描述】:

我有一个包含时间的数组列表。我想按时间升序排序。 我用了这个,但它没有输出我想要的。

List<String> l = new ArrayList<>();
l.add("12:20 PM");
l.add("12:32 PM");
l.add("12:30 PM");
l.add("12:10 PM");
l.add("12:08 PM");
l.add("12:00 PM");
Collections.sort(l, new Comparator<String>() { 
  @Override
  public int compare(String o1, String o2) {
    try {
      return new SimpleDateFormat("h:mm a").parse(o1).compareTo(new SimpleDateFormat("hh:mm a").parse(o2));
    } catch (ParseException e) {
      return 0;
    }
  }
 });
System.out.println(l);

我需要:

12:00 PM
12:08 PM
12:10 PM...

同样

【问题讨论】:

  • 你明白了吗?...
  • 这已经被回答了。事实上,几乎相同的标题。
  • 可能是一个小错误,但格式不同。你有一次“h:mm a”,另一个有“hh:mm a”。
  • 我得到的输出与列表中的订单相同
  • @Ole V.V ya 这对我有用,谢谢

标签: java sorting time


【解决方案1】:

让我们从这里开始:

} catch (ParseException e) {
    return 0;
}

ParseException 表示解析出错。您正在抑制它并将其转换为:两个字符串等于 same 时间。

别那样做。

那么我还建议不在该列表中存储字符串,而是 Date 对象。您必须了解每个比较都会导致这些格式化步骤。换句话说,在这里对字符串而不是日期进行排序会导致巨大的开销!

也就是说,先把所有的字符串都变成日期,然后再对日期进行排序。

【讨论】:

    【解决方案2】:

    您的日期格式错误:

    try {
        return new SimpleDateFormat("h:mm a").parse(o1).compareTo(new SimpleDateFormat("hh:mm a").parse(o2));
    } catch (ParseException e) {
        return 0;
    }
    

    它应该是hh:mm a,因为在你的例子中有两个数字代表小时。

    这会导致ParseException,因为您的字符串与格式不匹配。该异常被处理为将字符串视为相同。这不是处理该错误的好方法。

    因此,由于没有字符串与格式匹配,每次比较都会导致异常,该异常会将字符串视为相同,因此不会重新排序。

    【讨论】:

    • 在我的电脑上,h:mm a 可以很好地正确解析,即使 12:20 PM 中的小时数有两位数等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2013-06-14
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多