我有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;
答案 0 :(得分:70)
试试这个
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)));
答案 1 :(得分:3)
虽然有一种技术方法可以解决您的问题,但最基本的错误是将Date
表示为String
,这是一种“原始的痴迷”。
如果您有文本输入,请将其转换为java.util.Date
或适当的joda类(此处LocalDateTime
似乎合适)。这些类实现了Comparable
开箱即用,并且对它们进行排序很容易。但是它们还具有在操纵日期/时间实例时可能需要的所有其他逻辑,而字符串则没有。
<强> 更新 强>
从java 8开始,我很高兴建议使用它的LocalDateTime类。
答案 2 :(得分:3)
首先,作为Bowmore has already said,您不应该在列表中保留字符串。而是使用 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 tutorial: Date Time解释了如何使用java.time
,这是现代Java日期和时间API,其中包括LocalDateTime
和DateTimeFormatter
。>
答案 3 :(得分:2)
可以使用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);
}
});
通过使用它,您甚至不必将字符串解析为日期
答案 4 :(得分:1)
一种选择是将日期添加到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());
}
答案 5 :(得分: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
答案 6 :(得分:-1)
您可以根据需要编写自定义比较器来比较日期字符串和顺序。然后,您就可以使用实现的比较器对集合进行排序。