【问题标题】:Sort string array in java with 3rd element用第三个元素对java中的字符串数组进行排序
【发布时间】:2016-04-02 17:50:13
【问题描述】:

我有 3 个字符串。每个字符串在字符串中都有一个时间。例如, 1)“1 09:53 AM 5” 2)“2 06:25 PM 7” 3) “3 上午 10:21”

我希望这些字符串按时间排序。用JAVA怎么实现?

【问题讨论】:

  • 所写的问题对我来说不是很清楚:您是在问如何使用自定义比较逻辑对集合/数组中的项目进行排序,还是如何从中提取一些数据(在这种情况下为时间)字符串?
  • 我想对这些字符串进行排序,使这些字符串中提到的时间按升序排列。
  • 1在"1 09:53 AM 5"里面代表什么
  • 它是字符串的一部分

标签: java string sorting


【解决方案1】:

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);

【讨论】:

  • 你应该推荐新的java.time API,它更好。
【解决方案2】:
    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
}

【讨论】:

    【解决方案3】:

    Java 中没有“开箱即用”的解决方案。如果您需要以自定义方式对对象集合进行排序,则应使用Collections.sort(collection, myComparator) 方法并将collection 传递给它以排序并拥有java.util.Comparator 接口实现。

    在您的情况下,Comparator 实现似乎相当复杂,因为您首先需要解析每个字符串并识别日期。所以这里的主要问题是如何识别字符串中的时间。如果您已确定时间格式,请考虑使用正则表达式从字符串中提取时间。

    首先,您需要实现自己的时间识别逻辑。然后你可以基于这个识别逻辑编写一个解析器,它会返回一个包含原始字符串和解析日期的包装对象(在 Java 8 的情况下,你可以使用java.util.Datejava.util.LocalDateTime)。然后实现Comparator,它接受包装器对象的 2 个实例并比较它们的日期。 java.util.Datejava.util.LocalDateTime 类都实现了Comparable 接口并具有默认的比较逻辑,即使用升序日期比较。

    【讨论】:

      猜你喜欢
      • 2015-09-17
      • 2015-06-07
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多