40

我有一个arraylist字符串值,比如

ArrayList<String> datestring=new ArrayList<String>();
datestring.add("01/21/2013 @03:13 PM");
datestring.add("01/21/2013 @04:37 PM");
datestring.add("01/21/2013 @10:41 AM");
datestring.add("01/21/2013 @10:48 AM");
datestring.add("01/22/2013 @06:16 AM");
datestring.add("01/22/2013 @06:19 AM");
datestring.add("01/21/2013 @05:19 PM");
datestring.add("01/21/2013 @05:19 PM");

任何机构都可以帮助我对上述列表进行排序吗?以便根据 AM 和 PM 格式对值进行排序。
排序后的预期输出应该是

for (String s : datestring)
{
    System.out.println(s);
}

.

01/21/2013 @10:41 AM;
01/21/2013 @10:48 AM;
01/21/2013 @03:13 PM;
01/21/2013 @04:37 PM;
01/21/2013 @05:16 PM;
01/21/2013 @05:19 PM;
01/22/2013 @06:16 AM;
01/22/2013 @06:19 AM;
4

7 回答 7

97

试试这个

    Collections.sort(datestring, new Comparator<String>() {
        DateFormat f = new SimpleDateFormat("MM/dd/yyyy '@'hh:mm a");
        @Override
        public int compare(String o1, String o2) {
            try {
                return f.parse(o1).compareTo(f.parse(o2));
            } catch (ParseException e) {
                throw new IllegalArgumentException(e);
            }
        }
    });

或使用 Java 8

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy '@'hh:mm a");
    Collections.sort(datestring, (s1, s2) -> LocalDateTime.parse(s1, formatter).
            compareTo(LocalDateTime.parse(s2, formatter)));
于 2013-01-22T05:33:57.700 回答
10

可以使用下面给出的 compareTo 以字符串格式比较日期列表。

ArrayList<String> datestring=new ArrayList<String>();
datestring.add("01/21/2013 @03:13 PM");
datestring.add("01/21/2013 @04:37 PM");
datestring.add("01/21/2013 @10:41 AM");
datestring.add("01/21/2013 @10:48 AM");
datestring.add("01/22/2013 @06:16 AM");
datestring.add("01/22/2013 @06:19 AM");
datestring.add("01/21/2013 @05:19 PM");
datestring.add("01/21/2013 @05:19 PM");

Collections.sort(datestring, new Comparator<String>() {
                @Override
                public int compare(String object1, String object2) {
                    return object1.compareTo(object2);
                }
            });

通过使用它,您甚至不必将字符串解析为日期

于 2018-01-15T08:47:43.440 回答
7

一种选择是将日期添加到 TreeMap,将未格式化的日期作为键,将格式化的日期作为值。使用 TreeMap 将自动对值进行排序。

private ArrayList<String> sortDates(ArrayList<String> dates) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy");
    Map <Date, String> dateFormatMap = new TreeMap<>();
    for (String date: dates)
        dateFormatMap.put(f.parse(date), date);
    return new ArrayList<>(dateFormatMap.values());
}
于 2017-05-15T16:47:03.640 回答
5

java.time

首先,正如鲍莫尔已经说过的那样,您不应该在列表中保留字符串。相反,使用java.time类的实例。

保留LocalDateTime对象。或者ZonedDateTime,如果您知道时间在哪个时区。字符串有利于向用户展示,而不是用于在您的程序中进行操作,例如排序。

以下代码将您的列表转换为List<LocalDateTime>

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MM/dd/uuuu '@'hh:mm a", Locale.ENGLISH);

    List<LocalDateTime> dateTimeList = datestring.stream()
            .map(ds -> LocalDateTime.parse(ds, formatter))
            .collect(Collectors.toCollection(ArrayList::new));

现在排序很简单:

dateTimeList.sort(Comparator.naturalOrder());

LocalDateTime自从它们实现以来就具有自然顺序Comparable,因此Comparator.naturalOrder()可以进行排序。获得相同排序的另一种方法是:

dateTimeList.sort(LocalDateTime::compareTo);

为了将排序后的数据呈现给用户,我们当然希望将日期时间格式化为字符串:

dateTimeList.forEach(ldt -> System.out.println(ldt.format(formatter)));

输出是:

01/21/2013 @10:41 AM
01/21/2013 @10:48 AM
01/21/2013 @03:13 PM
01/21/2013 @04:37 PM
01/21/2013 @05:19 PM
01/21/2013 @05:19 PM
01/22/2013 @06:16 AM
01/22/2013 @06:19 AM

除了分号和一个简单的错字,我相信这正是您所要求的。

链接: Oracle 教程:日期时间解释如何使用java.time,现代 Java 日期和时间 API,包括LocalDateTimeDateTimeFormatter

于 2018-10-12T09:55:21.003 回答
3

虽然有一种技术方法可以解决您的问题,但基本错误是将Dates 表示为Strings,这是“原始痴迷”的一种形式。如果您有文本输入,请将其转换为java.util.Date或适当的 joda 类(LocalDateTime此处似乎合适)。这些类Comparable是开箱即用的,对它们进行排序很容易。但是它们还具有您在处理日期/时间实例时可能需要的所有其他逻辑,而字符串则没有。

更新

从 java 8 开始,我强烈推荐使用它的LocalDateTime类。

于 2013-01-22T06:03:14.877 回答
0

ArrayList 默认不支持排序。您可以使用

public static <T> void sort(List<T> list, Comparator<? super T> c)java.util.Collections课堂上。将比较器的实现传递给对日期进行排序,例如

http://www.coderanch.com/t/392338/java/java/compare-Dates-String-Format

于 2013-01-22T05:30:57.640 回答
-1

可能您可以编写一个自定义比较器来根据要求比较日期字符串和顺序。然后,您将能够使用实现的比较器对集合进行排序。

于 2013-01-22T05:37:58.680 回答