簡體   English   中英

將兩個二維 Arrays 變成一個二維數組,不同長度的 Arrays 和不同長度的 Arrays inside 2D Array

[英]Turning two 2-Dimensional Arrays into one 2-Dimensional Array with different length of Arrays and different length of Arrays inside 2D Array

你好,

我怎樣才能將兩個 2D Arrays變成一個 2D Array Array 長度與 Other不同 在二維數組中, Arrays可以有不同的長度

例子:

int[][] ary2DFirst = new int[][]{{1,1,1,1},{2,2,2},{3,3,3}};
int[][] ary2DSecond = new int[][]{{4},{5,5,5,5,5}};

結果應該是

addedUpAry2D == {{1,1,1,1},{2,2,2},{3,3,3},{4},{5,5,5,5,5}}

我不能用二維陣列噴射它,只能用一維陣列(如下所示)謝謝

import java.util.Arrays;

public class ArraysAndMore {

    public static int[] add2D(int[][]ary1, int[][]ary2){
    //Attention please. the return must be a two dimensional Array, because i couldnt do it, i did it with a one Dimensional Array.

        int aryElementCountFirst = 0;
        int aryElementCountSecond = 0;

        for (int[] i:ary1) {
            for (int n:i) {
                aryElementCountFirst++;
            }
        }

        for (int[] i:ary2) {
            for (int n:i) {
                aryElementCountSecond++;
            }
        }

        int[]arysInOneDFirst = new int[aryElementCountFirst];
        int[]arysInOneDSecond = new int[aryElementCountSecond];
        int counter = 0;

        for (int[] i:ary1) {
            for (int n:i) {
                arysInOneDFirst[counter++] = n;
            }
        }

        int counter2 = 0;
        for (int[] i:ary2) {
            for (int n:i) {
                arysInOneDSecond[counter2++] = n;
            }
        }

        int[] aryTwo1Dtogether = add(arysInOneDFirst, arysInOneDSecond);
        return aryTwo1Dtogether; **//should be a 2D Array!!**
    }

    public static int[] add(int[] ary1, int[]ary2) {

        ** //This Method turns two 1D Arrays into one 1D Array**\

        if(ary1.length==0 && ary2.length==0){
            return new int[0];
        }
        int[]addedUp = new int[ary1.length+ ary2.length];
        int counter = 0;
        for (int i = 0; i < ary1.length; i++) {
            addedUp[counter++] = ary1[i];
        }
        for (int i = 0; i < ary2.length; i++) {
            addedUp[counter++] = ary2[i];
        }
        return addedUp;
    }
    
    public static void main(String[] args) {

        int[][] ary2D1 = new int[][]{{1,1,1,1},{2,2,2},{3,3,3}};
        int[][] ary2D2 = new int[][]{{4},{5,5,5,5,5}};

        System.out.println(Arrays.toString(add2D(ary2D1, ary2D2)));
    }
    
}

我的 Output 看起來像這樣:

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

它需要看起來像這樣:

{{1,1,1,1},{2,2,2},{3,3,3},{4},{5,5,5,5,5}}

像這樣嘗試。

  • 使用Arrays.copyOf創建一個相同大小的新數組並復制第一個。
  • 那么最簡單的方法就是使用循環將第二個數組復制到第一個數組。
  • 這確保了結果數組不與前兩個共享對象。
public class ArraysAndMore {

    public static void main(String[] args) {
        int[][] ary2DFirst = new int[][]
            {
                    {1,1,1,1},
                    {2,2,2},
                    {3,3,3}};
        int[][] ary2DSecond = new int[][]
            {
                    {4},
                    {5,5,5,5,5}};

        int[][] result = add2D(ary2DFirst, ary2DSecond);
        System.out.println(Arrays.deepToString(result));
    }

   public static int[][] add2D(int[][] ary1, int[][] ary2) {
        // allocate a new array of proper size
        int[][] result = new int[ary1.length + ary2.length][];
        
        // copy the first array
        for (int i = 0; i < ary1.length; i++) {
            result[i] = Arrays.copyOf(ary1[i], ary1[i].length);
        }
        
        // copy the second array;
        int k = ary1.length;
        for (int i = 0; i < ary2.length; i++) {
            result[k++] = Arrays.copyOf(ary2[i], ary2[i].length);
        }
        return result;
    }
}

印刷

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

要記住的關鍵是二維 arrays 只是 arrays 的 arrays。

完成同樣事情的另一種方法是使用流。

int result2[][] = Stream.of(ary2DFirst, ary2DSecond)
                .flatMap(Arrays::stream).map(s -> Arrays.copyOf(s, s.length))
                .toArray(int[][]::new);

需要Arrays.copyOf以確保 arrays 不共享對象。

您可以使用System.arraycopy來執行此操作。 您不需要指定數組第二維的大小(這是您能夠以原始 arrays 開始的方式)。

第一個副本獲取a1並將其添加到a (生成的數組),然后將a2添加到a1的末尾(現在位於a中)。

public class so75024045 {
    public static void main(String[] args) {
        int[][] a1 = new int[][] { { 1, 1, 1, 1 }, { 2, 2, 2 }, { 3, 3, 3 } };
        int[][] a2 = new int[][] { { 4 }, { 5, 5, 5, 5, 5 } };
        int[][] a = new int[a1.length + a2.length][];

        System.arraycopy(a1, 0, a, 0, a1.length);
        System.arraycopy(a2, 0, a, a1.length, a2.length);

        for (int[] x : a) {
            for (int y : x) {
                System.out.print(y + " ");
            }
            System.out.println("");
        }
    }
}

使用流的另一種簡單方法:

public static int[][] add2D(int[][]ary1, int[][]ary2){
    return Stream.concat(Arrays.stream(ary1), Arrays.stream(ary2))
                 .toArray(int[][]::new);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM