2017-05-15 1 views
1

は、行列Aが与えられる:フィルタリングされた結果を含むより小さな行列を得るためにcharの行列をフィルタリングする方法は?

[[C,c,c,c,a,a,b], 
[1,3,3,3,2,2,1]] 

最初の行は、文字AZおよびAZを有し、第2行は、所与の文字がマトリクス状に表示された回数を表す数値を有し、どの行列を取るためにコードを書くことができAとBがある場合、Bをマトリックスにそれを変換する:最初の行には繰り返し文字を示していないが、2行目の文字が繰り返されるオリジナル回続け

[[C,c,a,b], 
[1,3,2,1]] 

ましたか?

for(i=0;i<matrixA.length;i++){ 
    if(matrixA[0][0] == matrixA[0][1]){ 
    matrixB[0][0] = matrixA[0][0] 
    matrixB[1][0] = matrixA[1][0] 
    } 
} 

どのように私はこの問題を解決することができます。

これは私がこれまで試してみました何ですか?

答えて

0

は、私はあなたが単にそれから、あなたの配列内の重複を削除することはできません実現し、あなたのmatrixB次のようになります。

Object[][] matrixA = { 
    {'C','c','c','c','a','a','b'}, 
    {1,3,3,3,2,2,1}}; 
ArrayList<Object> rowHolder = new ArrayList<>(); 

for(int i = 0; i < matrixA.length; i++){ //for each row 
    int j; 
    for(j = 0; j < matrixA[i].length-1; j++){ //for each element 
     if(matrixA[i][j] != matrixA[i][j+1]) //keep element if next element is different 
      rowHolder.add(matrixA[i][j]); 
    } 
    rowHolder.add(matrixA[i][j]); //add last element always (next element doesn't exist) 
    matrixA[i] = rowHolder.toArray(); //convert rowHolder to row 
    rowHolder.clear(); //reset for next row 
    System.out.println(Arrays.toString(matrixA[i])); 
} 

これは期待できます:

[[C, c, a, b], 
[1, 3, 2]] //final '1' removed as it is a "duplicate" of the first 

は、だから私は、代わりにこの手法を提案:

[C, c, a, b] 
[1, 3, 2, 1] 

ここで唯一の醜さは、マトリックスとArrayListタイプの両方にObjectを使用することです。これは、混合型の2D配列と、Javaのプリミティブとオブジェクト間の変換に制限があるためです。 ArrayList#toArrayの代わりにカスタムコンバータを使用した場合は、matrixAint[]rowHolderのパラメータはIntegerです。

関連する問題