【问题标题】:Sorting array of array Integer where the elements to sort are int in Java对数组 Integer 的排序数组,其中要排序的元素在 Java 中是 int
【发布时间】:2021-10-03 10:45:28
【问题描述】:

我有这两个整数数组:

  1. [[2021,06,24],[2021,06,22],[2021,04,19]]
  2. [[2021,04,19],[2021,06,22],[2021,06,24]]

我想要两个数组的顺序相同,我如何在 Java 中做到这一点? 所以我想要两个数组都按这个顺序:

  1. [[2021,06,24],[2021,06,22],[2021,04,19]]
  2. [[2021,06,24],[2021,06,22],[2021,04,19]]

【问题讨论】:

  • 什么意思?同样的顺序:list2 = new ArrayList<>(list1)...
  • 我希望列表的顺序相同,如果您可以看到第一个列表的第一个元素位于第二个列表的最后一个元素中
  • 请确定是什么使列表中的项目大于、小于或等于其他项目。子数组(例如 [2021, 06, 24])看起来可能代表日期。对吗?
  • 那么递减日期顺序?
  • @StvnBrkdll 是的,他们提供日期

标签: java arrays list sorting


【解决方案1】:

按日期排序

由于您的日期代表日期,因此更容易比较它们的是使用LocalDate 构建日期对象。

List<String> oLocalDate

List<String> o = List.of("2021", "04", "19");
LocalDate.of(Integer.parseInt(o.get(0)), Integer.parseInt(o.get(1)), Integer.parseInt(o.get(2)))

然后用List.sort应用这个逻辑

List<List<String>> values = Arrays.asList(List.of("2021", "04", "19"),
        List.of("2021", "06", "22"), List.of("2021", "06", "24"));

values.sort((o1, o2) -> LocalDate.of(Integer.parseInt(o2.get(0)), Integer.parseInt(o2.get(1)), Integer.parseInt(o2.get(2)))
        .compareTo(LocalDate.of(Integer.parseInt(o1.get(0)), Integer.parseInt(o1.get(1)), Integer.parseInt(o1.get(2)))));

System.out.println(values); // [[2021, 06, 24], [2021, 06, 22], [2021, 04, 19]]

您可以将解析器提取到方法中并使用Comparator.comparing

class DateSorter {
    public static void main(String[] args) {
        List<List<String>> values = Arrays.asList(List.of("2021", "04", "19"),
                List.of("2021", "06", "22"), List.of("2021", "06", "24"));
        values.sort(Comparator.comparing(DateSorter::toDate, Comparator.reverseOrder()));

        System.out.println(values); // [[2021, 06, 24], [2021, 06, 22], [2021, 04, 19]]
    }

    static LocalDate toDate(List<String> o) {
        return LocalDate.of(Integer.parseInt(o.get(0)), Integer.parseInt(o.get(1)), Integer.parseInt(o.get(2)));
    }
}

按字符串排序

您也可以只对每个列表排序一个字符串,以防您的字符串是像 04 而不是 4 这样的双位数字符串

List<List<String>> values = Arrays.asList(List.of("2021", "04", "19"),
        List.of("2021", "06", "22"), List.of("2021", "06", "24"));
values.sort(Comparator.comparing(List::toString, Comparator.reverseOrder()));
System.out.println(values); // [[2021, 06, 24], [2021, 06, 22], [2021, 04, 19]]

【讨论】:

  • 这返回一个 void 我想返回一个列表>
  • @ValerioAuricchio 然后添加return values。请记住,这只是一个示例,它使用了具有 void 返回类型的 main(...) 方法。这侧重于对列表进行排序,而不是返回它们,如果需要,您必须添加它们。
  • @ValerioAuricchio 你是什么意思?这是操作系统的主要方法是的,它是无效的
  • @azro 当我使用我期望接收列表的方法时> 在这种情况下我会收到一个无效为什么?
  • @ValerioAuricchio 从哪里接收?你如何运行代码?难道你不知道static void main 方法的用途吗?
【解决方案2】:

[可以像这样使用Comparator.comparingComparator.reverseOrder()对输入列表进行排序:

List<List<String>> list = Arrays.asList(
    Arrays.asList("2021", "04", "19"),
    Arrays.asList("2021", "06", "22"),
    Arrays.asList("2021", "06", "24")
    );
list.sort(Comparator.comparing(List::toString, Comparator.reverseOrder()));

System.out.println("Reversed = " + list);

输出:

Reversed = [[2021, 06, 24], [2021, 06, 22], [2021, 04, 19]]

另一种方法是在Comparator.comparing 之后立即应用方法Comparator::reversed,如下所示:

list.sort(Comparator.comparing(List<String>::toString).reversed());

更新

如果应该从某个现有列表中检索新的排序列表,这可以使用 Stream API 实现:Stream::sortedStream::collectCollectors.toList() 收集器:

List<List<String>> sortedPartitionsValues = partitionValues
        .stream()
        .sorted(Comparator.comparing(List<String>::toString).reversed())
        .collect(Collectors.toList());

【讨论】:

  • 我尝试执行 myList::toString 我收到此错误“无法解析方法 'toString'”
  • @ValerioAuricchio 这个答案是List::toString,而不是list::toStringmyList::toString
  • 我写了这个: List> sortedPartitionsValues = partitionValues.sort(List::toString, Comparator.reverseOrder());并且仍然收到此错误“无法从静态上下文引用非静态方法”
  • @ValerioAuricchio, List::sort 方法是 void 并且排序应用于给定的列表实例,在您的情况下是 partitionValues
  • @ValerioAuricchio,您可以查看更新
【解决方案3】:

这似乎解决了问题:

public class Tester {

    public static void main(String[] args) {
        int [][] ar = new int[][] {{2021, 04, 19}, {2021, 06, 22}, {2021, 06, 24}};
        List<int[]> list = Arrays.asList(ar);

        System.out.println("original:");
        list.forEach(subAr -> {
            System.out.println("[" + subAr[0] + ", " + subAr[1] + ", " + subAr[2] + "]");
        });

        list.sort((lhs, rhs) -> {
            LocalDate dlhs = LocalDate.of(lhs[0], lhs[1], lhs[2]);
            LocalDate drhs = LocalDate.of(rhs[0], rhs[1], rhs[2]);
            return drhs.compareTo(dlhs);
        });
        System.out.println("sorted:");
        list.forEach(subAr -> {
            System.out.println("[" + subAr[0] + ", " + subAr[1] + ", " + subAr[2] + "]");
        });
    }
}

输出是:

original:
[2021, 4, 19]
[2021, 6, 22]
[2021, 6, 24]
sorted:
[2021, 6, 24]
[2021, 6, 22]
[2021, 4, 19]

【讨论】:

  • 不要建议使用旧日期 API 的解决方案,尤其是不要使用 Calendar。看看LocalDate 等(基本上是java.time api)。这更易于使用且不易出错。
  • @Thomas 好建议,我会修改它。但是日历还没有被弃用(还),所以......
  • 好吧,Calendar 可能不会很快被弃用,但对于 AWT 和 JDK 的其他部分甚至其他库也是如此。这并不意味着我们应该向他们推荐新的解决方案:)
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多