2016-05-12 17 views
0

私は文字通り私を怒らせる基本的な質問があります。 私はいくつかのオブジェクトのリストをパラメータとして取得するメソッドを持っています。すべてのオブジェクトには、(xとyの座標に対応して)一対のintがあります。 目標は、以下の例のように、指定された座標でリスト内のすべてのオブジェクトに設定されたマーカーで2次元配列を出力します(mはマーカー、配列サイズはh:2、w:5)。配列の幅と高さは元のままでなければなりません。Java上の座標で設定されたマーカーで2次元配列を印刷

m.... 
...m. 

ここで私が来た解決策の1つがあります。その主な問題は、配列の幅にパラメータリスト内のオブジェクトの量が乗算されることです。

仮定:配列は文字配列であらかじめ定義されています。名前は 't'です。

public void printArray (ArrayList<Marker> marker) { 
    for (int h=0;h<t.length;h++) { 
     for (int w=0;w<t[h].length;w++) { 
      for (Marker m: marker) { 
       if (h==m.getY() && w==m.getX()) { 
        System.out.print('m'); 
       } else { 
        System.out.print('.'); 
       } 
      } 
     } 
     System.out.print("\n"); 
    } 

私はこれと戦う方法を教えてください。おかげさまで

+0

't'は、' printArray'がメンバ関数であるオブジェクトのフィールドですか? – Oebele

+1

まず、a) 'lenght'はあなたのforループで' length'にする必要があります。b)あなたの現在の出力はどうなっていますか? c)「t」はどのように見えますか? – SomeDude

答えて

0

これはもちろん、なぜ起こるのかはっきりしています。座標ごとに、マーカーごとに文字を印刷します。これは、hwのループを取り除くことによって解決されます。

このことができる。例えば、このような何か行うこと:ループがたくさんあるので

public void printArray (ArrayList<Marker> marker) { 

    // Create an array of chars, and make sure all values are set to '.' 
    boolean[][] array = new char[t.length][t[h].length]; 
    for (int h=0; h < t.length; h++) { 
     for (int w=0; w < t[h].length; w++) { 
      array[h][w] = '.'; 
     } 
    } 

    // For each marker, set the value in the array at the marker's position to m 
    for (Marker m: marker) { 
     array[m.getY()][m.getX()] = 'm'; 
    } 

    // Print the array 
    for (int h=0; h<t.length; h++) { 
     for (int w=0; w<t[h].length; w++) { 
      System.out.print(array[h][w]); 
     } 
     System.out.println(); 
    } 
} 

をおそらくこれは、最適な解決策ではありません。 javaが配列の値を初期化するためのより良いメソッドを持っているかどうかはわかりません。

+0

素晴らしい!それはうまくいった、ありがとう。私は配列の初期化ステップをスキップすることができますが、 '印刷'フェーズでそれを行うことができるitherソリューションが存在するのだろうかと思います。 – bucky

+0

@buckyはい、Xemaが示唆するように、ブール値の配列を使用する必要があります。 booleanのデフォルト値はfalseなので、配列を初期化する必要はありません。私はその方法がとにかく良いと思います。私がそれをアップアップしなかった唯一の理由は、彼が 'else'で中カッコを使用していないからです。 – Oebele

+0

ええと、私はXemaのソリューションをチェックしました。私にとっては同じように見えますが、配列はブール値で初期化され、さらに複雑になる可能性があります。とにかくそれは意味をなさない。みなさん、ありがとう! – bucky

0

の文字をすべて印刷しないでください。最も内側のループのマーカー。代わりに、そのループを使用して現在の(h、w)の位置にどの文字を印刷するかを決定し、の後にマーカーループを挿入し、適切な文字を印刷します。

0

あなたが何をしたいのかよく理解していれば、ブール値の配列をインスタンス化し、少なくともセルの座標を持つオブジェクトが存在することを表現することが考えられます。そして、ブール値の配列をスローし、真の場合は "m"を返します。 falseの場合オブジェクトがあるときはいつでも

boolean[][] boolTab = new boolean[2][5]; 
for (boolean[] row : boolTab){ 
    Arrays.fill(row,false); 
} 

この配列を記入:

for (Marker m: marker) { 
    boolTab[m.getY()][m.getX()] = 'm'; 
} 

印刷をここ

は、アレイは、例えば(しかし、まだそれを試していない)

インスタンス化です配列:

for (int h=0;h<2;h++) { 
    for (int w=0;w<5;w++) { 
     if (boolTab[h][w]){ 
      System.out.print('m'); 
     } 
     else System.out.print('.'); 
    } 
    System.out.print('\n'); 
} 

私はあなたの配列の最初の次元を考慮せずに単純にしました。しかし、あなたはこのコードを非常に簡単に上に適応させることができます。

EDIT:Oebeleによって提案されたいくつかの改善編集。

EDIT 2:フィル機能の誤用、訂正。

+1

あなたは外側のループを取り除くことによって2番目のビットを大幅に簡略化することができます – Oebele

+0

あなたは正しいです!それを変更する。 – Xema

+0

そして、印刷の際には、ifとelseを囲んで中括弧を使用してください。読みやすさのためにはるかに優れているため、間違いを起こしにくいです。 – Oebele