简单地说,我有一个不同日期和时间的字符串数组。每个元素都是这种格式:
2015-08-27T22:24:31.903
即,YYYY-MM-DD T HH:MM:SS.MMM
我正在整理它们。是否有可用于对此格式进行排序的默认方法?
我现在正在做的是将字符串拆分为 T ,将日期和时间转换为相应的时间戳,添加它们然后对时间戳值进行排序。是否有可用于此格式的直接解析器?最受欢迎的是更好的解决方案。
答案 0 :(得分:4)
我有一个字符串数组。每个元素都采用以下格式:
2015-08-27T22:24:31.903
。是否有可用于对此格式进行排序的默认方法?
是。由于ISO字符串的日期字段按数量级的降序排列,并且字段是固定宽度的,因此您可以使用Arrays.sort(Object[] a)
直接对字符串进行简单排序:按指令对指定的对象数组进行排序。其元素的自然排序。
是否有针对此格式的直接解析器?
是。 LocalDateTime.parse(CharSequence text)
:从LocalDateTime
等文本字符串中获取2007-12-03T10:15:30
的实例。
答案 1 :(得分:3)
我认为那些是字符串。如果您不想做明显的事情(将它们转换为java.util.Date
或java.time.Instant
并比较结果),您可以将它们作为字符串进行比较,即特定日期时间格式(几乎完整)当您使用字符串比较时,ISO-8601时间戳,只是缺少时区指示符)。
无偿示例(live copy):
import java.util.*;
class Example
{
public static void main (String[] args)
{
String[] strings = {
"2002-10-24T13:51:25.417",
"2001-03-25T23:41:24.234",
"2008-10-05T04:41:56.004",
"2013-04-10T22:14:06.852",
"2005-08-24T05:05:01.080",
"2015-11-20T17:32:27.303",
"2003-07-16T06:32:07.703",
"2005-03-20T08:28:18.440",
"2009-04-17T13:20:09.499",
"2002-11-04T06:39:55.287"
};
Arrays.sort(strings);
for (String s : strings) {
System.out.println(s);
}
}
}
输出:
2001-03-25T23:41:24.234 2002-10-24T13:51:25.417 2002-11-04T06:39:55.287 2003-07-16T06:32:07.703 2005-03-20T08:28:18.440 2005-08-24T05:05:01.080 2008-10-05T04:41:56.004 2009-04-17T13:20:09.499 2013-04-10T22:14:06.852 2015-11-20T17:32:27.303
如果您需要不同的订购(例如逆序),您当然可以提供Comparator
。
答案 2 :(得分:2)
Answer by Andreas是正确的。这是使用添加到更高版本的Java中的较新功能的变体。
使用List.of
输入一些示例数据。结果列表不可修改。因此,将不可修改列表提供给ArrayList
的构造函数,以获取可排序的可修改列表。
List < String > strings = new ArrayList <>(
List.of(
"2015-08-27T22:24:31.903" ,
"2018-08-27T22:24:31.903" ,
"2016-08-27T22:24:31.903" ,
"2017-08-27T22:24:31.903"
)
);
如该其他答案所述,您的字符串为标准ISO 8601格式。当按字母顺序排序时,该特定格式被设计为按时间顺序排列。因此,如果此任务是此数据的唯一目标,则无需将其解析为日期时间对象。就像文本一样,作为String
对象。
Collections
接口使用了List
方法,而不是使用sort
实用工具类。该方法需要Comparator
。除了实现该接口,我们可以调用Comparator.naturalOrder()
来生成实例。
strings.sort( Comparator.naturalOrder() );
转储到控制台。
System.out.println( "strings = " + strings );
请参阅此code run live at IdeOne.com。
字符串= [2015-08-27T22:24:31.903,2016-08-27T22:24:31.903,2017-08-27T22:24:31.903,2018-08-27T22:24:31.903]
如果您将进一步处理此输入,则将其解析为日期时间对象。
现代方法使用 java.time 类。
我们可以简化示例数据,因为我们可以直接处理List
产生的不可修改的List.of
。
List < String > strings =
List.of(
"2015-08-27T22:24:31.903" ,
"2018-08-27T22:24:31.903" ,
"2016-08-27T22:24:31.903" ,
"2017-08-27T22:24:31.903"
);
制作LocalDateTime
个对象中的空List
。
List < LocalDateTime > ldts = new ArrayList <>( strings.size() );
通过一次解析我们的输入字符串并生成一个LocalDateTime
对象来填充该列表。将该对象添加到我们的列表中。
请注意, java.time 类默认情况下使用ISO 8601格式。因此,无需指定格式设置模式。
for ( String string : strings )
{
ldts.add( LocalDateTime.parse( string ) ); // Parsing text in ISO 8601 format needs no formatting pattern to be specified.
}
排序,如上所述。呼叫List::sort
,并传递Comparator
。
ldts.sort( Comparator.naturalOrder() ) ;
看到那个code run live at IdeOne.com。
System.out.println( "ldts = " + ldts );
如果想花哨的话,可以用for
代替Stream
循环。我们可以单线完成这项工作。
List < String > strings =
List.of(
"2015-08-27T22:24:31.903" ,
"2018-08-27T22:24:31.903" ,
"2016-08-27T22:24:31.903" ,
"2017-08-27T22:24:31.903"
);
List < LocalDateTime > ldts =
strings
.stream()
.map( s -> LocalDateTime.parse( s ) )
.sorted()
.collect( Collectors.toList() )
;
System.out.println( "ldts = " + ldts );
ldts = [2015-08-27T22:24:31.903,2016-08-27T22:24:31.903,2017-08-27T22:24:31.903,2018-08-27T22:24:31.903]
答案 3 :(得分:1)
1)使用适当的SimpleDateFormat:
解析字符串SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss.SSS");
try {
Date date = formatter.parse(dateInString);
} catch (ParseException e) {
e.printStackTrace();
}
2)将每个日期存储在列表中。为此,首先要实例化一个新列表...
ArrayList<Date> myDates = new ArrayList<Date>();
...在parse命令之后将每个日期添加到列表中:
myDates.add(date);
3)使用以下方式对它们进行排序:
Collections.sort(myDates); // Ascending
或
Collections.sort(myDates, Collections.reverseOrder()); // Descending
答案 4 :(得分:0)
使用Calendar API对日期和时间进行排序
import java.util.ArrayList;
import java.util.Collections;
public class SortMain {
public static void main(String[] args) {
ArrayList<SomeObj> al= new ArrayList();
SomeObj s1 = new SomeObj("9", "2020-02-05");
al.add(s1);
s1 = new SomeObj("7", "2020-02-05");
al.add(s1);
/*s1 = new SomeObj("15", "2019-12-25");
al.add(s1);
s1 = new SomeObj("6", "2019-12-25");
al.add(s1);*/
printArrayList(al);
Collections.sort(al);
System.out.println("*************");
printArrayList(al);
}
private static void printArrayList(ArrayList<SomeObj> al) {
for(SomeObj someObj: al) {
System.out.println(someObj.getDate() + " ** " + someObj.getTime());
}
}
}
然后
package com.karthik.sorting;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class SomeObj implements Comparable<SomeObj>{
private String time;
private String date;
public SomeObj(String time, String date) {
super();
this.time = time;
this.date = date;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public int compareTo(SomeObj siteHealthGraphItem) {
String receivedPattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(receivedPattern);
try {
Date date1 = simpleDateFormat.parse(getDate().toString());
Date date2 = simpleDateFormat.parse(siteHealthGraphItem.getDate().toString());
if (getTime() == null) {
return date1.compareTo(date2);
} else if (getTime() != null) {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(getTime()));
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
cal2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(siteHealthGraphItem.getTime()));
return cal1.compareTo(cal2);
}
} catch (Exception e) {
System.out.println("Data is improper - Sorting Did not work..!");
e.printStackTrace();
}
System.out.println("Sorting Did not work..!");
return 0;
}
}