2

配列 [300][300] があり、エッジを取り除き、新しい配列 [298][298] に残りの値を入力する必要があります。私はこれまでのところこれを持っています:

double[][] edging() {
   double [][] array = new double [data.length] [data[0].length];
   array = bubbles();   
   double [] [] newArray = new double[array.length-2][array[0].length-2]; 

   System.arraycopy(array,1,newArray, 0, newArray.length);

   array = newArray;
   System.out.println( + newArray.length);  
   System.out.println( + newArray[0].length);   

   return newArray;
}

これにより、上端と下端が削除されます。しかし、右と左はまだそこにあります。そこのチェックは、新しい配列が [298][300] であることを示しています。

各行を順番に削除し、それぞれに arraycopy を使用して新しい行を返すループを作成することを考えました。ただし、これが非常に効率的かどうかはわかりません。

これを試しましたが、役に立ちませんでした。次のテストは、それを回転させ、上記のコードを再度使用することです。

4

1 に答える 1

2

どうぞ。System.arraycopy() は O(n^2) 実行時間で実行されるため、必ずしも使用する必要はありません。以下のプログラムでは、エッジ ケースを処理していませんが、これで処理できるはずです。

class MyClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        int[][] sampleArray = {{11, 12, 13, 14, 15, 16},
                {17, 18, 19, 20, 21, 22},
                {23, 24, 25, 26, 27, 28},
                {29, 30, 31, 32, 33, 34},
        };

        myClass.removeEdges(sampleArray);
    }


    public int[][] removeEdges(int[][] arrayToTrim){
        int[][] newArray = new int[arrayToTrim.length-2][arrayToTrim[0].length-2];
        print2DArray(arrayToTrim);
        for(int i=1;i<arrayToTrim.length-1;i++){
            for(int j=1;j<arrayToTrim[0].length-1;j++){
                newArray[i-1][j-1] = arrayToTrim[i][j];
            }
        }
        System.out.println();
        print2DArray(newArray);
        return newArray;
    }

    private void print2DArray(int[][] anArray){
        for(int i=0;i<anArray.length;i++){
            System.out.println();
            for(int j=0;j<anArray[0].length;j++){
                System.out.print(anArray[i][j]+" ");
            }
        }
    }
}

上記のプログラムの出力は、

11 12 13 14 15 16 
17 18 19 20 21 22 
23 24 25 26 27 28 
29 30 31 32 33 34 

18 19 20 21 
24 25 26 27 
于 2011-11-02T07:18:04.660 に答える