【问题标题】:How to sort a 2D ArrayList by column value, and what if the values are equal?如何按列值对 2D ArrayList 进行排序,如果值相等怎么办?
【发布时间】:2021-07-26 10:37:19
【问题描述】:

我想按二维ArrayList 的特定列值对它们进行排序,如果两个数组的列值相等,则使用另一个列值比较这两个数组。

例如:

array = [[2, 3, 4, 5][0, 2, 3, 4][0, 1, 2, 3][1, 2, 3, 4]]

我想先将它们与它们的索引[0] 进行比较,但由于array[1][0]array[2][0] 具有相同的值0 我想通过它们的索引[3] 来比较这两个数组。

因此,新数组将是:

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

我有这个代码

public ArrayList<List<Integer>> sortArray(ArrayList<List<Integer>> spaces) {
    final Comparator<List<Integer>> comparator = new Comparator<List<Integer>>() {
        @Override
        public int compare(List<Integer> sList1, List<Integer> sList2) {
            return sList1.get(0).compareTo(sList2.get(0));
        }
    };

    Collections.sort(spaces, comparator);

    return spaces;
}

但是,这只比较索引[0]的值,当值相等时没有条件。

【问题讨论】:

    标签: java arrays sorting arraylist multidimensional-array


    【解决方案1】:

    您需要修改您的 Comparator 以处理索引检查,如下所示:

    public int compare(List<Integer> sList1, List<Integer> sList2) {
        if (sList1.get(0) != sList2.get(0)) {
            return sList1.get(0).compareTo(sList2.get(0));
        } else {
            return sList1.get(3).compareTo(sList2.get(3));
        }
    }
    

    但如果您运行的是 Java 8 及更高版本,您可以直接执行以下操作来对您的集合进行排序:

    Collections.sort(spaces, (sList1, sList2) -> {
        if (sList1.get(0) != sList2.get(0)) {
            return sList1.get(0).compareTo(sList2.get(0));
        } else {
            return sList1.get(3).compareTo(sList2.get(3));
        }
    });
    

    对于 Java 8 之前的版本,您可以执行类似于您已经在执行的操作:

    Collections.sort(spaces, new Comparator<List<Integer>>() {
        @Override
        public int compare(List<Integer> sList1, List<Integer> sList2) {
            if (sList1.get(0) != sList2.get(0)) {
                return sList1.get(0).compareTo(sList2.get(0));
            } else {
                return sList1.get(3).compareTo(sList2.get(3));
            }
        }
    });
    

    在这两种情况下,输出都是:

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

    【讨论】:

      【解决方案2】:

      您需要比较子列表中的所有项目。例如:

      public int compare(List<Integer> sList1, List<Integer> sList2) {
          for (int i = 0; i < 4; i++) {
              int c = sList1.get(i).compareTo(sList2.get(i));
              if (c != 0)
                  return c;
          }
          return 0;
      }
      

      如果您正在寻找快速算法,不建议这样做。

      【讨论】:

        【解决方案3】:

        我认为你可以使用 Java Collections.List 的 compareTo 方法(我们简称 CT)。以下是 CT 的一些示例输出。 5.CT(7) -> -1; 7.CT(5) -> 1 ; 5.CT(5) -> 0 ; 当它们相同时 compareTo 返回 0,所以你根本不交换它们的位置。我不确定我是否正确回答了这个问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-17
          • 2019-03-10
          • 1970-01-01
          • 1970-01-01
          • 2015-07-08
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多