【问题标题】:Sorting 2d arrays using Java Comparator使用 Java Comparator 对二维数组进行排序
【发布时间】:2016-05-10 23:12:33
【问题描述】:

我有一个名为 interval[g][2] 的二维数组,其中 g 是某个数字。 目前,我正在尝试通过第一个元素中的递增顺序对数组进行排序,如果它们相等,则按第二个元素中的递减顺序进行排序。

我尝试过两种方式:

1) 使用 Java 8 的 Comparator.comparing 方法

Arrays.sort(interval, Comparator.comparing((int[] arr) -> arr[0]));

2) 使用 Arrays.sort

Arrays.sort(interval, new Comparator<int[]>() {
    @Override
    public int compare(int[] s1, int[] s2) {
        if (s1[0] > s2[0])
            return 1;
        else if (s1[0] < s2[0])
            return -1;
        else {
            if(s1[1] < s2[1])
                return 1;
            else if (s1[1] > s2[1])
                return -1;
            else
                return 0;
        }
    }
});

第一个方法返回一个部分排序的列表。

[[0, 10], [10, 30], [30, 50]]
[[0, 10], [3, 19], [35, 45]]
[[10, 30], [27, 33], [30, 50]]
[[-10, 10], [0, 20], [35, 45]]
[[10, 30], [20, 40], [30, 50]]
[[0, 20], [8, 28], [37, 43]]
[[0, 20], [15, 35], [37, 43]]
[[0, 0], [8, 28], [10, 40]]

如您所见,它在一组三个元组中对事物进行排序。

第二种方法根本不对数组进行排序。我不能使用原始数据类型进行排序吗?谁能给点建议?

【问题讨论】:

  • 是什么生成了您显示的输出?显示代码。这看起来像一个 3d 数组。
  • 这看起来像是用 g=3 对二维数组进行排序的 8 个不同示例。它们看起来都按照 3 对中的第一个值完美排序。由于没有一对在位置 1 具有相同的值,你怎么知道二级排序是否有效?
  • @JimGarrison 我根据提供的输入设置 g ——但你是对的,我意识到我从未为以下一组输入更新 g。我已经修复了我的代码并尝试了下面的答案,它似乎有效。谢谢!
  • @Andreas 我从未更新过 g 值。现在它已经修复了,有了下面的答案,排序就按照它应该的方式工作了。谢谢!

标签: java arrays sorting


【解决方案1】:

我想你正在寻找这个:

Arrays.sort(interval, Comparator.comparingInt((int[] arr) -> arr[0]).thenComparing(Comparator.comparingInt((int[] arr) -> arr[1]).reversed()));

或者,如果您想使用自定义 Comparator

 Arrays.sort(interval, new Comparator<int[]>() {
     @Override
     public int compare(int[] o1, int[] o2) {
         int result = Integer.compare(o1[0], o2[0]);
         if (result == 0) {
             result = Integer.compare(o2[1], o1[1]);
         }
         return result;
     }
 });

【讨论】:

  • 非常好。 Op 的 #2 运行良好,但我喜欢你的较短版本(我当然喜欢,我正要发布相同的答案)
【解决方案2】:
int[][] interval = new int[][] { {0, 10}, {10, 30}, {30, 50}, {0, 10}, {3, 19}, {35, 45}, {10, 30}, {27, 33}, {30, 50}, {-10, 10}, {0, 20}, {35, 45}, {10, 30}, {20, 40}, {30, 50}, {0, 20}, {8, 28}, {37, 43}, {0, 20}, {15, 35}, {37, 43}, {0, 0}, {8, 28}, {10, 40} };

Arrays.sort(interval, Comparator.<int[]>comparingInt(arr -> arr[0]).thenComparing(arr -> arr[1], Comparator.<Integer>naturalOrder().reversed()));

Stream.of(interval).forEachOrdered(ints -> System.out.println(Arrays.toString(ints)));

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2021-11-14
    • 2019-04-07
    • 2021-07-14
    • 2013-05-26
    • 2013-08-17
    • 2015-09-17
    相关资源
    最近更新 更多