在Java中按时间对ArrayList进行排序

我有一个List ,其中包含从上午8:00到下午4:00的时间列表。

当我在输出中显示它时,它显示未排序,当我使用Collections.sort(myList); 它从下午1点到8点进行排序。

我如何从早上8点到下午4点对列表进行排序?

不要重新发明轮子,使用集合(或者如果允许java8则使用Lambdas)如何??将列表保留为字符串,但使用匿名比较器 ,在那里,将字符串解析为日期,比较它们,你就拥有它。 这里有一个片段:

 List l = new ArrayList(); l.add("8:00 am"); l.add("8:32 am"); l.add("8:10 am"); l.add("1:00 pm"); l.add("3:00 pm"); l.add("2:00 pm"); Collections.sort(l, new Comparator() { @Override public int compare(String o1, String o2) { try { return new SimpleDateFormat("hh:mm a").parse(o1).compareTo(new SimpleDateFormat("hh:mm a").parse(o2)); } catch (ParseException e) { return 0; } } }); System.out.println(l); 

将字符串转换为日期并对日期进行排序。 在Java中,您应该始终按原样处理对象,而不是字符串。 字符串是名称或其他文本,当字符串有特殊含义时,您最好将其转换为有意义的对象。

在列表中使用24小时时间格式,然后对其进行排序。

您可以随时将其还原为AM和PM。

这是一个简短的计划,你想做什么。

 public static void main(String[] args) throws ParseException { ArrayList times = new ArrayList(); times.add("8:00 pm"); times.add("8:00 am"); times.add("7:00 pm"); times.add("7:00 am"); ArrayList dates = new ArrayList(); DateFormat format = new SimpleDateFormat("h:ma", Locale.ENGLISH); for(String time : times){ dates.add(format.parse(time)); } Collections.sort(dates); System.out.println(dates); } 

脚步:

  • 将每个字符串转换为标准化Date
  • 使用Collections.sort()排序

像其他人一样,我建议不要重新发明轮子,我还建议丢弃旧的和过时的类SimpleDateFormatDate 。 这些天我们好多了。

特定

 static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH); 

我们可以做的

  Collections.sort(listOfTimeStrings, Comparator.comparing( (String s) -> LocalTime.parse(s.toUpperCase(), dtf))); 

这将很好地适用于几百个字符串,甚至更多。 但是,每次要比较两个字符串时,它将解析每个字符串。 这可能是很多次。 如果你只想解析每个字符串一次,而是:

  List sortedList = listOfTimeStrings.stream() .map(String::toUpperCase) .map(s -> LocalTime.parse(s, dtf)) .sorted() .map(dtf::format) .map(String::toLowerCase) .collect(Collectors.toList()); 

当你以小写字母给出am和pm时,我已经完全理解了,所以我在解析之前转换为大写,并在格式化之后转换为小写。 根据您的数据,您可以跳过这些步骤。