【问题标题】:Sorting array contains some arrays in java排序数组包含java中的一些数组
【发布时间】:2019-05-21 19:45:51
【问题描述】:

我有一个包含数组的数组。 我需要编写一个函数来对大数组上的小数组进行排序(我的意思是小数组的最小总和是索引 0 上的第一个和 index1 上的第二个以及小数组的最大总和 in大数组的结尾 =index bigArray.length-1

如何对包含数组的数组进行排序? 我需要这样做,没有任何对象或类似的东西。只是常规和简单的代码。 enter image description here

public static int [][] sum (int [][] arr) {

int sum=0;
for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr.length; j++) {

        sum=sum+arr[i][j];

    }

【问题讨论】:

  • 你会写一个比较器。
  • 而且想出一些示例数据集也很有帮助。然后使用一张纸和一支笔,计算如何“手动”对这些东西进行分类。尤其是如何比较数组中的不同条目。然后你试着把它放在代码中。
  • 如果我知道我要排序的数组的所有总和,我知道我想做什么,但是我如何比较所有数组?你能帮帮我吗?

标签: java arrays sorting


【解决方案1】:

由于对内部数组求和是一个相对耗时的过程,并且在排序时需要多次求和,因此您应该创建一个对象来保存数组和求和,例如

static class ArraySum implements Comparable<ArraySum> {
    final int[] array;
    final int sum;
    ArraySum(int[] array) {
        this.array = array;
        this.sum = Arrays.stream(array).sum();
    }
    @Override
    public int compareTo(ArraySum that) {
        return Integer.compare(this.sum, that.sum);
    }
}

既然是Comparable,你可以直接排序,所以有了它,你可以很容易地使用Java 8+流对外部数组进行排序:

public static int[][] sort(int[][] arr) {
    return Arrays.stream(arr).map(ArraySum::new).sorted()
                 .map(a -> a.array).toArray(int[][]::new);
}

这不对输入的二维数组进行排序,而是返回一个新的二维数组,即一个新的外部数组,其中原始内部数组已排序。

测试

int[][] arr = { { 3, 5, 4 }, { 4, 3, 1, 2 }, { 5, 6 } };
int[][] arr2 = sort(arr);
System.out.println(Arrays.deepToString(arr));
System.out.println(Arrays.deepToString(arr2));

输出

[[3, 5, 4], [4, 3, 1, 2], [5, 6]]
[[4, 3, 1, 2], [5, 6], [3, 5, 4]]
//    10         11        12     sum

可以看到,原来的二维数组没有被修改,新的数组是按照内部数组的和排序的。

【讨论】:

  • 我需要在没有对象或类似的东西的情况下这样做。只是常规和简单的代码...
  • @LiroyLevi 问题中未列出此类约束。这是性能最好的解决方案,所以我将其保留原样,以便其他可能没有这些限制的人可以找到它。
  • 好吧对不起打扰你了。谢谢你=]如果你能我会很高兴你能帮助我
【解决方案2】:

我认为这并不完美,但它肯定会让你接近。我相信这是一种冒泡排序技术。

public static int [][] sum (int [][] arr) {
    
    //start at first array
    for (int i = 0; i < arr.length - 1; i++) {
        //sum of first array
        int sum1 = 0;
        for (int j = 0; j < arr[i].length; j++){
            sum1 += arr[i][j];
        }
        //compare to each of the arrays after
        for (int k = i+1; k < arr.length; k++) {
            int sum2 = 0;
            for (int l = 0; l < arr[k].length; j++){
                sum2 += arr[k][l];
            }
            //if second array is smaller, swap
            if (sum2 < sum1){
                //might need to change this part to do complete copy
                temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
        }
    }
    return arr
}
    

【讨论】:

  • 我做了类似的事情,但我不知道用户会给我多少小数组。我需要编写完成所有这些的函数
  • 这将遍历数组的整个长度。只要至少有两个可以比较,就会全部通过。如果只有一个数组,则会出现错误,因此您需要一个 if 语句来处理这种情况。如果只有一个数组,那么它已经排序了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2018-04-08
  • 2015-09-20
相关资源
最近更新 更多