【问题标题】:Compare and sort strings in String format using Comparator使用比较器比较和排序字符串格式的字符串
【发布时间】:2022-12-05 05:47:47
【问题描述】:

任务: 给定数组

String[] dates = {
            "07-05-1990",
            "28-01-2010",
            "11-08-1990",
            "15-01-2010",
            "16-06-1970"
        };

我需要编写 Comparator 按以下顺序对该数组进行排序:

String[] expected = {
            "16-06-1970",
            "07-05-1990",
            "11-08-1990",
            "15-01-2010",
            "28-01-2010"
        };

我写了这段代码,但它不起作用:

import java.util.Comparator;

public class DateSort implements Comparator<String>{

    @Override
    public int compare(String str1, String str2) {
        if (str1.length() != 10 || str2.length() != 10) {
            throw new IllegalArgumentException("The string must be 10 characters long.");
        }
        
        Comparator<String> strComparator =  Comparator.comparing(s -> s.substring(6, 9))
                                                      .thenComparing(s -> s.subtring(3, 5))
                                                      .thenComparing(s -> s.subtring(0, 2));
        return strComparator;
    }
    
}

如何修复此代码以便根据任务对给定数组进行排序?

条件:只能使用比较器。不能使用日期和时间 API。我们需要使用 Comparator 比较数组中的字符串。我们无法将给定数组的字符串元素解析为日期。

【问题讨论】:

  • 将字符串拆分为日/月/年,将它们解析为整数并进行比较,首先是年,然后是月,然后是日。
  • 如果你想要这种方法,Comparator.comparing(s -&gt; s.substring(6, 9))应该是Comparator.comparing(s -&gt; s.substring(6, 10))。我更喜欢:解析为 LocalDate 对象,排序并格式化回字符串。或者更好的是,始终使用 LocalDate 对象,并且仅在需要提供字符串输出时才格式化为字符串。
  • 以什么方式不起作用?您观察到哪种不良结果?

标签: java arrays string compare comparator


【解决方案1】:

您的代码的问题是您从 compare 方法返回 Comparator 对象本身。但是,compare 方法应该返回一个 int 值,指示第一个字符串是小于、等于还是大于第二个字符串。为此,您需要使用您创建的Comparator对象的compare方法。

以下是如何使用您的类对给定数组进行排序:

String[] dates = {
    "07-05-1990",
    "28-01-2010",
    "11-08-1990",
    "15-01-2010",
    "16-06-1970"
};

Arrays.sort(dates, new DateSort());

排序后,日期数组将按照任务中指定的顺序进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2018-01-16
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多