【问题标题】:Sort 2D array by specific row按特定行对二维数组进行排序
【发布时间】:2016-03-23 16:05:00
【问题描述】:

我想按第二行升序对 2x3 数组进行排序。第一行的值必须相应地改变位置。

例如

1 3 5
4 2 6

应该变成

3 1 5
2 4 6

代码:

int[][] values = {{1, 5, 3},
                  {4, 6, 2}};
Arrays.sort(values, new Comparator<int[]>(){
    public int compare(int[] o1, int[] o2) {
        return (Integer.valueOf(o1[0]).compareTo(o2[0]));
    }
});

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

输出与输入相同。我认为错误来自compare 方法,但我不知道它是什么。这是什么?

【问题讨论】:

  • values 包含两个元素。 Arrays.sort 根据比较器重新排列这两个元素。在这种情况下,第一个元素{1, 5, 3} 确实小于{4, 6, 2},因此顺序不会改变。
  • 你可以先转置数组stackoverflow.com/questions/26197466/…排序,然后再转置回来。
  • 有没有办法按原样对二维数组进行排序,而不必转置它?

标签: java arrays sorting multidimensional-array


【解决方案1】:

请试试这个,会成功的,

public static void main(String[] args) {

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

        for(int i = 0 ; i < values.length; i ++){
            for(int j = 1 ; j < values[i].length ; j ++){
                if(i != 0){
                    if(values[i][j-1] > values[i][j] ){

                        for(int k = j;k>0;k--){

                            if(values[i][k-1] > values[i][k] ){
                                 int temp1 = values[i][k-1];
                                 values[i][k-1] =  values[i][k];
                                 values[i][k] = temp1;
                                 int temp2  = values[i-1][k-1];
                                 values[i-1][k-1] =  values[i-1][k];
                                 values[i-1][k] = temp2;
                            }

                        }


                    }
                }
            }
        }


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

    }

输出:

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

【讨论】:

  • 只有在values 很小的情况下才有效。您没有正确实施冒泡排序。
【解决方案2】:

您的比较器逻辑存在问题,因为您只比较不同行的相同列的值,而不是同一行的不同列。

你应该做的是这样的事情:

public static void main (String[] args) throws Exception
{
    int[][] values = {{1, 5, 3},
                      {4, 6, 2}};

    for(int i = 0; i < 2; i++) {                  
        for(int j = i + 1; j < 3; j++) {
            if(values[1][i] > values[1][j]) {
                swap(values,0,i,j);
                swap(values,1,i,j);
            }
        }
    }
}

private static void swap(int[][] values,int row,int x, int y) {
    int temp = values[row][x];
    values[row][x] = values[row][y];
    values[row][y] = temp;
}

您必须适当地更改比较器逻辑。

【讨论】:

  • 如果values 的行数超过 2 行,您的冒泡排序将无法正常工作,因为您只执行一次迭代。您必须不断迭代,直到所有内容都排序完毕。
  • @SpiderPig 我知道,但问题是,“我想按第二行升序对 2x3 数组进行排序。”
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多