我有3个字符串。每个字符串在字符串中都有一个时间。例如, 1)“1 09:53 AM 5” 2)“2 06:25 PM 7” 3)“3 10:21 AM”
我想根据时间对这些字符串进行排序。如何在JAVA中完成?
答案 0 :(得分:2)
1st-解析每一行并执行此操作:(不要忘记使用StringTokenizer删除第一个数字)
String str = "10:20 AM";
SimpleDateFormat formatador = new SimpleDateFormat("hh:mm a");
Date data = formatador.parse(str);
Time time = new Time(data.getTime());
2nd - 将每个Time对象保存在如下声明的数组列表中:
ArrayList<Time> list;
3rd - 对数组进行排序
Collections.sort(list);
答案 1 :(得分:1)
List<String> unsorted = Arrays.asList(
"1 09:53 AM 5",
"2 06:25 PM 7",
"3 10:21 AM "
);
List<String> sorted = unsorted.stream()
.sorted(comparing(this::stringToTime))
.collect(toList());
sorted.forEach(System.out::println);
这要求方法stringToTime
具有以下几个支持常量:
// Used to parse the time string to a LocalTime
private static final DateTimeFormatter TIME_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("hh:mm a")
.toFormatter(Locale.ENGLISH);
// Regex pattern that picks out the time string
private final static Pattern TIME_PATTERN = Pattern.compile("\\d\\d:\\d\\d [AP]M");
private LocalTime stringToTime(String input) {
Matcher matcher = TIME_PATTERN.matcher(input);
matcher.find(); // Find time pattern in string
return LocalTime.from(TIME_FORMATTER.parse(matcher.group())); // Convert time string to LocalTime
}
答案 2 :(得分:0)
没有&#34;开箱即用&#34; Java中的解决方案。如果您需要以自定义方式对对象集合进行排序,则应使用Collections.sort(collection, myComparator)
方法并将collection
传递给排序并拥有java.util.Comparator
接口实现。
在您的情况下,Comparator
实现似乎非常复杂,因为您需要先解析每个字符串并识别日期。所以这里的主要问题是如何识别字符串中的时间。如果您已确定时间格式,请考虑使用正则表达式从字符串中提取时间。
首先,您需要实现自己的时间识别逻辑。然后你可以编写一个基于这个识别逻辑的解析器,它会返回一个包含原始字符串和解析日期的包装器对象(在Java 8的情况下你可以使用java.util.Date
或java.util.LocalDateTime
)。然后实现包含2个包装器对象实例的Comparator
并比较它们的日期。 java.util.Date
或&#39; java.util.LocalDateTime&#39;实现Comparable
接口,并具有使用ASC日期比较的默认比较逻辑。