【问题标题】:How to sort two dimensional array using Comparator in java如何在java中使用比较器对二维数组进行排序
【发布时间】:2020-07-20 02:57:15
【问题描述】:

我需要通过对第一列的元素进行降序来对这样的数组进行排序。在第一列元素相等的情况下,第二列元素必须按升序排序。但这我需要的是检查并将空行放在矩阵的末尾,并且只有一个元素放在具有更多元素的相同元素之前的行。 例如在这个数组中{3} - 它是第一行,{} - 最后一行。

int[][] arr = {{1, 2, 3}, {}, {3}, {1, 4}, {3, 2}, {3, 3, 5}};

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

for (int[] ints : arr) {
    for (int anInt : ints) {
        System.out.print(anInt + " ");
    }
    System.out.println();
}

【问题讨论】:

  • 你想如何比较不规则的数组项? {} 是否被认为高于或低于 {3}{1, 2, 3}{1, 4} 怎么样?
  • 所以,每个空行都到数组的最后,如果我们有 {3} 和 {3, 0, 2} - {3} 在 {3, 0, 2} 之前
  • {1, 2, 3}{1, 2} 怎么样?
  • @ВладГригоренко:我已经编辑了我的答案以符合最后一个标准。

标签: java arrays sorting comparator


【解决方案1】:

以下Comparator&lt;int[]&gt; 启用排序方式:

  1. 空数组作为最后一个

  2. 同一索引处较大的数字按升序排列

  3. 如果较小的数组从索引 0 开始先变成较大的(就长度而言),则认为与后一个相比,先出现的数组更小。

这里有一个算法可以根据你的需要轻松修改:

int[][] arr = {{1, 2, 3}, {}, {3}, {1, 4}, {3, 2, 2}, {3, 3, 5}, {3, 2}};

Arrays.sort(arr, (o1, o2) -> {
        if (o1.length == 0) { return 1; }         // empty last
        if (o2.length == 0) { return -1; }        // empty last
        int min = Math.min(o1.length, o2.length); // upper bound to avoid ArrayIndexOutOfBoundsException
        for (int i = 0; i < min ; i++) {
            if (o1[i] != o2[i]) {                 // compare values on indices
                return o1[i] - o2[i];             // return if different
            } 
        }
        return 1;                                 // it goes first so it lefts first
    }
);

System.out.println(Arrays.deepToString(arr)); 

输出将是:

[[1, 2, 3], [1, 4], [3], [3, 2, 2], [3, 2], [3, 3, 5], []]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2013-05-26
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多