2017-10-24 14 views
0

arrayは次のようになります:{{1,3,5,7},{2,4,6,8,10,12},{2,3,5,7,11,13,17}}と言います。ギザギザの配列から行と列を削除しますか?

1行と1列が削除されていることを除いて、この配列とまったく同じJavaで新しい配列を作成するにはどうすればよいですか?

この作業は偶数サイズのアレイでも実行できますが、ギザギザのアレイでは問題が発生します。私は最初に不特定の列数を持つ新しい配列を作成することを考えましたが、どこから行くのですか?

/** 
    * Creates a new array that is a copy of the input matrix, except that one 
    * row and one column have been altered. 
    * Precondition: the row index is between 0 (inclusive) and the number of 
    * rows of matrix (not inclusive) 
    * @param matrix the input two dimensional array 
    * @param row the index of the row to remove 
    * @param col the index of the column to remove 
    */ 
public static int[][] removeRowAndCol(int[][] matrix, int row, int col) { 
int[][] altered = new int[(matrix.length - 1)][]; 
int x = 0; 
for(int i = 0; i < matrix.length; i++){ 
    if(matrix[i].length < col + 1 && i != row){ 
    altered[x] = new int[matrix[i].length]; 
    for(int j = 0; j < altered[x].length; j++){ 
     altered[x][j] = matrix[i][j]; 
    } 
    if(x < matrix.length - 1){ 
     x++; 
    } 
} 
else if(matrix[i].length > col && i != row){ 
    altered[x] = new int[matrix[i].length - 1]; 
    int y = 0; 
    for(int z = 0; z < matrix[i].length - 1; z++){ 
     if(z != col){ 
      altered[x][y] = matrix[i][z]; 
      y++; 
     } 
     else{ 
      z--; 
     } 
    } 
    if(x < matrix.length - 1){ 
     x++; 
    } 
    } 
} 
    return altered; 
    } 
} 

ようなテストケースを実行している: removeRowAndCol(新しいINT [] [] {{1,2}、{3,4}}、1、1)、メソッド戻り{{1} } どちらが正しい。

int [] [] array = {{1,2,3,4}、{11,12,13,14,15,16}、{21,22,23} 、24}、{31,32,33}}; removeRowAndCol(array、0、0) removeRowAndCol(array、2,3) メソッドがフリーズします。

誰かがコードを見て、私が間違ったことを教えてもらえますか?

+0

は、行または列が最小のサブアレイ未満であることが保証されて?つまり、行1に列5がないので列5を削除しないでください – Tyler

+0

削除する列と行はどれですか? –

+0

ギザギザであるという事実はそれほど難しくはありません。あなたは通常の場合のコードを含めることができますか? –

答えて

0

二次元配列は、ギザギザであるかどうかにかかわらず、何よりも配列の配列です。各行を手作業で作成する必要があるため、個々の行ごとに任意のサイズを選択できます。出力

import java.util.Arrays; 

public class Temp { 
    public static void main(String[] args) { 
     int[][] jagged = {{1, 2, 3}, {4, 5, 6, 7, 8}, {9, 10, 11, 12, 13, 14, 15, 16}}; 
     System.out.println("Jagged: " + Arrays.deepToString(jagged)); 
     System.out.println("Smaller 1: " + Arrays.deepToString(removeRowAndCol(jagged, 0, 0))); 
     System.out.println("Smaller 2: " + Arrays.deepToString(removeRowAndCol(jagged, 1, 1))); 
     System.out.println("Smaller 3: " + Arrays.deepToString(removeRowAndCol(jagged, 2, 2))); 
    } 

    private static int[][] removeRowAndCol(int[][] jagged, int i, int j) { 
     int[][] smaller = new int[jagged.length - 1][]; 

     // WARN: outofbounds checks are not implemented! 
     for (int smallerI = 0; smallerI < smaller.length; smallerI++) { 
      int sourcedI = smallerI; 
      if (smallerI >= i) { 
       sourcedI++; 
      } 

      smaller[smallerI] = new int[jagged[sourcedI].length - 1]; 

      for (int smallerJ = 0; smallerJ < smaller[smallerI].length; smallerJ++) { 
       int sourcedJ = smallerJ; 
       if (smallerJ >= j) { 
        sourcedJ++; 
       } 
       smaller[smallerI][smallerJ] = jagged[sourcedI][sourcedJ]; 
      } 
     } 

     return smaller; 
    } 
} 

Jagged: [[1, 2, 3], [4, 5, 6, 7, 8], [9, 10, 11, 12, 13, 14, 15, 16]] 
Smaller 1: [[5, 6, 7, 8], [10, 11, 12, 13, 14, 15, 16]] 
Smaller 2: [[1, 3], [9, 11, 12, 13, 14, 15, 16]] 
Smaller 3: [[1, 2], [4, 5, 7, 8]] 
+0

何か分かりません:1行だけを削除すると、なぜ小さい方の配列の行長がjagged.length - 2になるのでしょうか?それは - 1ではありませんか? – Isaac

+0

確かに、あまりにも速いタイピングと十分な考え方ではない:) – spi

+0

私は自分自身の実装を試みました。私が持っているコードで質問を更新しました。しかし、間違いなくループに何か問題があります。あなたは私のためにそれを見てみることができますか? – Isaac

関連する問題