如何整理具有两种格式的字符串日期和时间的列表?
How to sort out a list having string date and time in two formats?
我是初学者,在 java.I 从事 android 开发,有一个日期和时间列表,格式为 String
dd/MM/yyyy hh:mm X
,其中 MM 可以是单个数字数字或两位数,X 可以是任何数字 int.I 已经尝试了所有方法来排序 out.Can 你能帮我写代码吗?
我有一些字符串示例:
"02/08/2017 13:00 198"
"02/7/2018 08:00 75"
"04/12/2014 19:00 5"
我认为最简单的解决方案之一是通过确保当 MM 是单个数字时我们在 MM 前面加上 0 来统一格式。然后你可以用常规排序对它们进行排序。
您可以通过以下方式确保格式正确:
String unify(String s) {
if (s.charAt(4) != '/') {
return s;
}
return s.substring(0, 3) + "0" + s.substring(3);
}
可以使用自定义比较器对字符串进行排序,如 中提到的 haaawk(可能很快就会在答案中)。这意味着每次比较两个字符串时都要解析字符串,如果字符串很多,这可能是一种明显的浪费。相反,我建议使用包含字符串和已解析日期时间的自定义 class。
public class StringWithDateTime implements Comparable<StringWithDateTime> {
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("dd/M/uuuu HH:mm");
private String dateTimeAndInt;
/**
* (Premature?) optimization: the dateTime from the string
* to avoid parsing over and over
*/
private LocalDateTime dateTime;
public StringWithDateTime(String dateTimeAndInt) {
this.dateTimeAndInt = dateTimeAndInt;
// parse the date-time from the beginning of the string
dateTime = LocalDateTime.from(
FORMATTER.parse(dateTimeAndInt, new ParsePosition(0)));
}
@Override
public int compareTo(StringWithDateTime other) {
return dateTime.compareTo(other.dateTime);
}
@Override
public String toString() {
return dateTimeAndInt;
}
}
有了这个class你可以做例如
List<StringWithDateTime> listWithDateTimes = Arrays.asList(
new StringWithDateTime("02/08/2017 13:00 198"),
new StringWithDateTime("02/7/2018 08:00 75"),
new StringWithDateTime("04/12/2014 19:00 5")
);
Collections.sort(listWithDateTimes);
listWithDateTimes.forEach(System.out::println);
代码段的输出是按时间顺序排列的原始字符串:
04/12/2014 19:00 5
02/08/2017 13:00 198
02/7/2018 08:00 75
继续以这种方式对更多字符串进行排序。
使用 DateTimeFormatter
,而格式模式字符串中的 MM
将需要 2 位数的月份,而 M
将同时匹配 1 位数和 2 位数的月份,因为在您的格式的不同变体中。
java.time
问题:您使用的是 java.time
,现代 Java 日期和时间 API — 这在我的 Android 设备上有效吗?
会的。新的 API 被称为 JSR-310。要在 Android 上使用它,请获取 ThreeTenABP the Android backport of JSR-310 (from Java 8). More explanation in .
对于阅读的任何人(以及为 Android 以外的东西编程),java.time
内置于 Java 8 及更高版本中。您可以在 Java 6 和 7 到 ThreeTen Backport.
中使用它
问题;为什么是外部图书馆? Android 不是内置了 SimpleDateFormat
吗?
现代 API 所以 更好用,尤其是 SimpleDateFormat
是出了名的麻烦。相反,我建议您今天开始使用面向未来的 API。
我是初学者,在 java.I 从事 android 开发,有一个日期和时间列表,格式为 String
dd/MM/yyyy hh:mm X
,其中 MM 可以是单个数字数字或两位数,X 可以是任何数字 int.I 已经尝试了所有方法来排序 out.Can 你能帮我写代码吗?
我有一些字符串示例:
"02/08/2017 13:00 198"
"02/7/2018 08:00 75"
"04/12/2014 19:00 5"
我认为最简单的解决方案之一是通过确保当 MM 是单个数字时我们在 MM 前面加上 0 来统一格式。然后你可以用常规排序对它们进行排序。
您可以通过以下方式确保格式正确:
String unify(String s) {
if (s.charAt(4) != '/') {
return s;
}
return s.substring(0, 3) + "0" + s.substring(3);
}
可以使用自定义比较器对字符串进行排序,如
public class StringWithDateTime implements Comparable<StringWithDateTime> {
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("dd/M/uuuu HH:mm");
private String dateTimeAndInt;
/**
* (Premature?) optimization: the dateTime from the string
* to avoid parsing over and over
*/
private LocalDateTime dateTime;
public StringWithDateTime(String dateTimeAndInt) {
this.dateTimeAndInt = dateTimeAndInt;
// parse the date-time from the beginning of the string
dateTime = LocalDateTime.from(
FORMATTER.parse(dateTimeAndInt, new ParsePosition(0)));
}
@Override
public int compareTo(StringWithDateTime other) {
return dateTime.compareTo(other.dateTime);
}
@Override
public String toString() {
return dateTimeAndInt;
}
}
有了这个class你可以做例如
List<StringWithDateTime> listWithDateTimes = Arrays.asList(
new StringWithDateTime("02/08/2017 13:00 198"),
new StringWithDateTime("02/7/2018 08:00 75"),
new StringWithDateTime("04/12/2014 19:00 5")
);
Collections.sort(listWithDateTimes);
listWithDateTimes.forEach(System.out::println);
代码段的输出是按时间顺序排列的原始字符串:
04/12/2014 19:00 5
02/08/2017 13:00 198
02/7/2018 08:00 75
继续以这种方式对更多字符串进行排序。
使用 DateTimeFormatter
,而格式模式字符串中的 MM
将需要 2 位数的月份,而 M
将同时匹配 1 位数和 2 位数的月份,因为在您的格式的不同变体中。
java.time
问题:您使用的是 java.time
,现代 Java 日期和时间 API — 这在我的 Android 设备上有效吗?
会的。新的 API 被称为 JSR-310。要在 Android 上使用它,请获取 ThreeTenABP the Android backport of JSR-310 (from Java 8). More explanation in
对于阅读的任何人(以及为 Android 以外的东西编程),java.time
内置于 Java 8 及更高版本中。您可以在 Java 6 和 7 到 ThreeTen Backport.
问题;为什么是外部图书馆? Android 不是内置了 SimpleDateFormat
吗?
现代 API 所以 更好用,尤其是 SimpleDateFormat
是出了名的麻烦。相反,我建议您今天开始使用面向未来的 API。