代码之家  ›  专栏  ›  技术社区  ›  heisenberg

如何按升序对第一行、第二行和第三行中的数字进行排序,但要保存列的顺序?

  •  0
  • heisenberg  · 技术社区  · 6 年前

    如何按列值的升序对第一行、第二行和第三行中的数字进行排序。例如,我有以下数组:

      7 |10 |15 | 7 | 7
      5 | 0 | 4 | 3 | 3
      1 | 4 | 3 | 2 | 4
    

    然后,我需要通过对第一行进行排序并保存列顺序来转换它:

     7 | 7 | 7 |10 |15
     5 | 3 | 3 | 0 | 4
     1 | 2 | 4 | 4 | 3
    

    在第二次迭代中,我应该得到这样的结果:

     7 | 7 | 7 |10 |15
     3 | 3 | 5 | 0 | 4
     4 | 2 | 1 | 4 | 3
    

    最后:

     7 | 7 | 7 |10 |15
     3 | 3 | 5 | 0 | 4
     2 | 4 | 1 | 4 | 3
    

    我有以下代码对第一行进行排序并按顺序保存列:

      Integer k = column.size() - 1;
      while (k > 1) {
        Integer id = 0;
        for (Integer j = 1; j <= k; j++)
          if (listWithNumbers[0][j] > listWithNumbers[0][id])
            id = j;
          for (Integer i = 0; i < listWithNumbers.size(); i++) {
            Integer max = listWithNumbers[i][id];
            listWithNumbers[i][id] = listWithNumbers[i][k];
            listWithNumbers[i][k] = max;
          }
      k -= 1;
    }
    

    我试图重写同样的代码来对第二行进行排序,但排序不正确:

    k = column.size() - 1;
    while (k > 1) {
      Integer id = 0;
        for (Integer j = 1; j <= k; j++) {
            if (listWithNumbers[0][j-1] == listWithNumbers[0][j])
              id = j-1;
          for (Integer i = 1; i < listWithNumbers.size(); i++) {
            Integer max = listWithNumbers[i][id];
            listWithNumbers[i][id] = listWithNumbers[i][k];
            listWithNumbers[i][k] = max;
          }    
        }        
      k -= 1;
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Usagi Miyamoto    6 年前

    如果不需要多次迭代,例如不需要打印出步骤,那么只需创建一个 Comparator 它检查第一行,然后如果相同的检查第二行,依此类推…

    像这样:

    public Comparator<Number[]> comp = (Number[] a, Number[] b) ->
    {
      for ( int i = 0; i < a.length; ++i )
        if ( !a[i].equals( b[i] ) )
          return a[i].compareTo( b[i] );
      return 0;
    }