【问题标题】:How to fully sort 2d array in java?如何在java中对二维数组进行完全排序?
【发布时间】:2017-08-15 16:45:59
【问题描述】:

我想在 java 中对二维数组进行排序。 例如 假设我有这个矩阵

1    5    4
3    7    8
2    9    6

排序后的结果应该是这样的

1    2    3
4    5    6
7    8    9

请帮帮我。

我已经为这个问题编写了以下代码

class Sort2dArrayFull{
public static void sort(int el[][]){
    int m=0;
    int n=0;
    int temp=0;
    int k1=1;

    for(int i=0; i<el.length; i++){
        for(int j=0; j<el[i].length; j++){
            System.out.print(el[i][j]+" ");
        }
        System.out.print("\n");
    }

    System.out.print("\n");

    for(int i=0; i<el.length; i++){
        for(int j=0; j<el[i].length; j++){
            for(int k=j+1; k<el[m+n].length; k++){
                if(el[i][j]>el[m+n][k1]){

                    temp=el[i][j];
                    el[i][j]=el[m+n][k1];
                    el[m+n][k1]=temp;

                }

                k1++;

                if(k1==el[m+n].length){
                    k1=0;
                }
                if(k==el[m+n].length){
                    m++;

                }

                if(m==el.length){
                    m=0;
                    n++;
                }

            }
        }
    }

    for(int i=0; i<el.length; i++){
        for(int j=0; j<el[i].length; j++){
            System.out.print(el[i][j]+" ");
        }
        System.out.print("\n");
    }
}
public static void main(String... args){
    sort(new int[][]{{1,5,7,2},{55,44,11,77,33},{15,19,16,14,12,13}});
}

}

这个程序的输出是

//排序前

1 5 7 2

55 44 11 77 33

15 19 16 14 12 13

//排序后

19 15 44 55

1 7 5 77 33

2 11 16 14 12 13

但我想要这样的结果

1 2 5 7

11 12 13 14 15

16 19 33 44 55 77

【问题讨论】:

  • 请尝试一下然后问。
  • SO 不会为你做作业。
  • 尝试使用java.util.Arrays.sort 并覆盖java.util.Comparator 中的compare 方法。
  • 欢迎来到 Stack Overflow!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example。使用“编辑”链接改进您的问题 - 不要通过 cmets 添加更多信息。谢谢!
  • 如果您将其视为一维数组(通过实际将其复制到一个这样的数组中,或通过使用一些坐标映射函数),这将容易得多。

标签: java arrays sorting 2d


【解决方案1】:

如果我是你,我会这样做:

public static void sort(int el[][]){
    for(int i=0; i<el.length; i++){
        for(int j=0; j<el[i].length; j++){
            System.out.print(el[i][j]+" ");
        }
        System.out.print("\n");
    }
    ArrayList<Integer> arrayToSort = new ArrayList<Integer>();
    for (int x = 0; x < el.length; x++)
    {
        for (int y = 0; y < el[x].length; y++)
        {
            arrayToSort.add(el[x][y]);
        }
    }
    Integer[] sortedArray = new Integer[arrayToSort.size()];
    sortedArray = arrayToSort.toArray(sortedArray);
    Arrays.sort(sortedArray);
    int sequence = 0;
    for (int x = 0; x < el.length; x++)
    {
        for (int y = 0; y < el[x].length; y++)
        {
            el[x][y] = sortedArray[sequence++];
        }
    }
    System.out.println("\nAfter:");
    for(int i=0; i<el.length; i++){
        for(int j=0; j<el[i].length; j++){
            System.out.print(el[i][j]+" ");
        }
        System.out.print("\n");
    }
}

【讨论】:

  • 可以去掉中间列表,直接写入sortedArray(可以是int[]而不是Integer[]
  • 感谢您宝贵的时间。但它不起作用。 :(
  • 你的意思是它不工作?它在我的工作区中正确排序。
【解决方案2】:

您可以尝试在向您的教授展示此内容时获得分数 :)

    Integer[][] a = {{1, 5, 4}, {3, 7, 8}, {2, 9, 6}};
    AtomicInteger i = new AtomicInteger();
    Map<Integer, List<Integer>> sortedAndGrouped =
            Arrays.stream(a)
                    .flatMap(l -> Arrays.stream(l))
                    .sorted()
                    .collect(Collectors.groupingBy(x -> i.getAndIncrement() / a.length));
    System.out.println(Arrays.toString(
            IntStream.range(0, a.length)
                    .mapToObj(r -> sortedAndGrouped.get(r))
                    .toArray()));

【讨论】:

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