【问题标题】:Swap rows in 2d array by row sum in Java在Java中按行和交换二维数组中的行
【发布时间】:2016-02-09 17:53:32
【问题描述】:

我实现了这个东西,但我不确定这是正确的

   Example : int [][]={{2,1,0},{2,8,9},{1,1,0}}

在上面1 (2+1+0=3) 行中的元素总和小于2(2+8+9=19) 行中的元素总和并且大于第3 行的总和(2)。

最终的数组应该是{{2,8,9},{2,1,0},{1,1,0}}

    int arr[5][5];
    int rowSum[5];
    int sum = 0;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
        sum = sum + arr[i][j];
        }
        rowSum[i] = sum;
        sum=0;
    }

    int swap;
    //now sorting
    for (int c = 0 ; c < ( n - 1 ); c++)
      {
        for (int d = 0 ; d < n - c - 1; d++)
        {
          if (rowSum[d] > rowSum[d+1]) /* For decreasing order use < */
          {
            swap       = rowSum[d];
            rowSum[d]   = rowSum[d+1];
            rowSum[d+1] = swap;

        //swapping original array
        for(int i=0;i<5;i++){
           swap = arr[d][i];
           arr[d][i] = arr[d+1][i];
               arr[d+1][i] = swap;
        }
          }
        }
     }

【问题讨论】:

  • “我不确定这是否正确” - 你测试过吗?我觉得不错
  • 是否有充分的理由不实现Comparator&lt;int[]&gt; 并使用Arrays.sort
  • 您好。请不要在您的帖子中添加“紧急”,尤其是在标题中 - 这只是被删除的噪音。请注意,这里的问题同样重要。谢谢!

标签: java arrays


【解决方案1】:

使用 Java 8 功能:

int[][] arr = { { 2, 1, 0 }, { 2, 8, 9 }, { 1, 1, 0 } };
Arrays.sort(arr, Comparator.comparingInt((int[] row) -> Arrays.stream(row).sum()).reversed());
System.out.println(Arrays.deepToString(arr));

【讨论】:

    【解决方案2】:
    Integer[][] numbers = new Integer[][]{{2,1,0},{2,8,9},{1,1,0}};
    System.out.println("Before:");
    for(Integer[] row : numbers) {
      for(Integer num : row) {
        System.out.print(num+",");
      }
      System.out.println("");
    }
    
    Arrays.sort(numbers, new Comparator<Integer[]>(){
      @Override
      public int compare(Integer[] o1, Integer[] o2) {
        Integer sumArray_1 = 0;
        Integer sumArray_2 = 0;
        for(int i = 0; i < o1.length; ++i) {
          sumArray_1 += o1[i];
        }
    
        for(int i = 0; i < o2.length; ++i) {
          sumArray_2 += o2[i];
        }
    
        return sumArray_2.compareTo(sumArray_1); //Decending order 
      }
    });
    System.out.println("After:");
    for(Integer[] row : numbers) {
      for(Integer num : row) {
        System.out.print(num+",");
      }
      System.out.println("");
    }
    

    输出:

    Before:
    2,1,0,
    2,8,9,
    1,1,0,
    After:
    2,8,9,
    2,1,0,
    1,1,0,
    

    【讨论】:

    • 那么,您认为return o2[1].compareTo(o1[1]); 是比较整数数组的合适方法吗?提示:不,不是。它还完全忽略了该数组中每个数字的总和。
    • 很高兴看到您花时间改进您的答案。请注意一个小“问题”:如果每个子数组的长度不同,您的 for 循环就会出现问题:P。
    • @Tom 我知道有一个问题可以轻松解决。
    【解决方案3】:

    使用下面的代码片段,

            int[][] temp = {{2,1,0},{2,8,9},{1,1,0}};
            Arrays.sort(temp, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                return Integer.compare(b[1], a[1]);
            }
            });
            System.out.println("After applying comparator");
            for(int[] arr:temp){
                for(int val:arr){
                    System.out.print(val+" ");
                }
                System.out.println("");
            }
    

    它会像这样显示输出,

    After applying comparator
    2 8 9 
    2 1 0 
    1 1 0 
    

    【讨论】:

    • 所以您认为return Integer.compare(b[1], a[1]); 是比较整数数组的合适方法?提示:不,不是。它还完全忽略了该数组中每个数字的总和。
    • @Tom:您会考虑添加自己的答案吗? :-).
    • @halfer 没必要,因为 Flown 已经写了一篇不错的 :)(也是唯一真正工作的 :D)。
    • 啊,对@Tom,在这种情况下,您可能想在问题下ping OP!
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2018-10-15
    • 2020-03-30
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多