2

多次元文字列配列の操作に問題があります。わかりやすくしていただければ幸いです。

多次元文字列配列がどのように機能するかを理解するために、いろいろと試してみたサンプルコードを以下に投稿します。私はコメントで、私が何が起こると期待し、何が結果になると期待するかを書きましたが、そうではありません。私の質問は、なぜそれが私が考えているように機能しないのかということです。マトリックスを作成する必要があります[1] [2] [3]

[4] [5] [6]

また、2x3 martrixがすでに設定されている場合、[1] [1]などの特定の要素に値を再割り当てするにはどうすればよいですか、または行を呼び出して変数に割り当てる必要がありますか。このサンプルコード全体は、多次元文字列配列で要素を割り当ててから再割り当てする方法を学ぶためのものです。これらの文字列配列リストは、事前に次元がわからず、値が変更されるため、.addメソッドを使用し、最終的には.setを使用する必要があります。

助けてくれてありがとう、StackOverflowにあるように見える素晴らしいコミュニティ

TextView displayanswer;
String text0, text1, text2, text3, text4, text5, text6;
ArrayList<String> column = new ArrayList<String>();
ArrayList<ArrayList<String>> row = new ArrayList<ArrayList<String>>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test1);
    displayanswer = (TextView) findViewById(R.id.textView1);

    //Creates Matrix in column variable of [1][2][3]
    column.add("1");
    column.add("2");
    column.add("3");  

    row.add(column);  //Creates Matrix in row variable of [1][2][3]
    row.add(column);  //Creates 2 dimension matrix of  [1][2][3]
                     //                                [1][2][3]

    column.set(0, "4"); //column variable Matrix becomes  [4][2][3]
    column.set(1, "5"); //column variable Matrix becomes  [4][5][3]
    column.set(2, "6"); //column variable Matrix becomes  [4][5][6]
    row.set(1,column);  //2 dimensional matrix becomes  [1][2][3]
                                                                  //[4][5][6]

           column = row.get(0); //get first row of 2 row matrix, should be[1][2][3]

    //Assigning first row elements to text strings
    text0 = column.get(0); text1 = column.get(1); text2 = column.get(2);

    column = row.get(1); //gets second row of 2 row matrix, should be [4][5][6]

    //Assigning second row elements to text strings
    text3 = column.get(0); text4 = column.get(1); text5 = column.get(2);

    //should give me 123456 but instead I get 456456???
    displayanswer.setText(""+text0 +text1 +text2 +text3 +text4 +text5);

}

}

4

3 に答える 3

1

リストに何かを追加すると、データのコピーが作成されると想定していると思います。ただし、そうではありません。リストには、実際のコンテンツ自体(のコピー)ではなく、追加するデータへの参照が含まれます。

したがって、以下のコメントは正しいですが、'column'オブジェクトを2回追加しているため...

row.add(column);  //Creates Matrix in row variable of [1][2][3]
row.add(column);  //Creates 2 dimension matrix of  [1][2][3]

...両方のリストエントリが同じオブジェクトを参照します。次に、1つの列の値を変更しようとすると、実際には参照されるオブジェクトが変更されるため、両方のエントリが変更されます。そのため、「456456」になってしまいます。

同じオブジェクトが最初の2つの位置で参照されるため、これは実際には両方の列に影響します。

column.set(0, "4"); //column variable Matrix becomes  [4][2][3]
column.set(1, "5"); //column variable Matrix becomes  [4][5][3]
column.set(2, "6"); //column variable Matrix becomes  [4][5][6]

次のことは正しくありません。

row.set(1,column);  //2 dimensional matrix becomes  [1][2][3]
                                                              //[4][5][6]

両方のエントリが変更されるため(両方が同じオブジェクトを参照しているため)、最終的に次のようになります。

[4][5][6]
[4][5][6]

これを「修正」するには、2番目の列を追加する前に、必ず新しい「列」オブジェクトを作成してください。または、同じオブジェクトを変更し続ける場合は、データのコピーをリストに追加してください。例えば:

//Creates Matrix in column variable of [1][2][3]
column.add("1");
column.add("2");
column.add("3");

row.add(new ArrayList<String>(column));
row.add(new ArrayList<String>(column));

その後column、リストの内容に影響を与えることなく安全に変更できます。データのコピーを行として追加したため、リストのコンテンツを直接操作することもできます。これにより、すべてのエントリが異なるオブジェクトを指すようになります。それが理にかなっていることを願っています。

Matrixちなみに、もっと複雑なことを計画している場合は、実際のクラスを作成することを検討したいと思います。リストは、行列を表すのに特に理想的ではありません。あるいは、おそらくあなたの周りにたくさんのマトリックス実装があり、そこから学んだり借りたりすることができます。ちょっとした考え。:)

于 2013-01-13T01:07:21.533 に答える
0

あなたがしたことを見てください:

column.add("1");
column.add("2");
column.add("3");

column.set(0, "4"); //column variable Matrix becomes  [4][2][3]
column.set(1, "5"); //column variable Matrix becomes  [4][5][3]
column.set(2, "6"); //column variable Matrix becomes  [4][5][6]

これが、インデックス0、1、および2を4、5、および6で上書きしているために456が表示されている理由です。

あなたがそれをよりよく理解できるように、私はあなたのためにテストスクリプトを作成しました:

import java.util.ArrayList;


public class Initialize {

static ArrayList<String> column = new ArrayList<String>();
static ArrayList<String> newColumn  = null;
static ArrayList<ArrayList<String>> row = new ArrayList<ArrayList<String>>();

public static void main(String[] str){

    // Stuffing the column ArrayList for later use
    for( int i = 1; i <= 6; i++ ){
        column.add( Integer.toString(i) );
        if( i == 6 ){
            row.add( column );
            break;
        }
    }


    for( int rowsCounter = 0; rowsCounter < row.size(); rowsCounter++ ){
        //this is where you can print the row content
        System.out.println( "Row index: " + rowsCounter );

        //passing the row content to a new ArrayList so that we can print the elements for the next loop
        if( newColumn == null ){
            newColumn = new ArrayList<String>();
        }
        newColumn = row.get(rowsCounter);

        for( int colsCounter = 0; colsCounter < column.size(); colsCounter++ ){
            //this is where you can print the column content
            System.out.println( "Column index: " + colsCounter + " | value: " + column.get(colsCounter) );
        }

    }
}

}

それでも理解できない場合は繰り返してみて、行き詰まった場合は助けを求めてください。幸運を!

于 2013-01-13T01:18:11.063 に答える
0

MHの答えの助けを借りて、私は簡単な例を思いつくことができました:

(私が抱えていた最大の問題はOPと同じでした:内部配列リストを持つ配列リストは参照のみを作成し、コピーは作成しません!以下の例ではコピーを作成します)

//Create list objects
ArrayList<String> innerArray = new ArrayList<String>();     //Columns with data
ArrayList<ArrayList<String>> outterArray = new ArrayList<ArrayList<String>>();  //Rows with columns

//Populate row 1
innerArray.add("Row1: Column1");                        //column1
innerArray.add("Row1: Column2");                        //column2
innerArray.add("Row1: Column3");                        //column3
outterArray.add(new ArrayList<String>(innerArray));     //add contents to main array
innerArray.clear();                                     //clear contents since we added it to main array and want it empty for next row

//Populate row 2
innerArray.add("Row2: Column1");                        //column1
innerArray.add("Row2: Column2");                        //column2
innerArray.add("Row2: Column3");                        //column3
outterArray.add(new ArrayList<String>(innerArray));                                 //add contents to main array
innerArray.clear();                                     //clear contents since we added it to main array and want it empty for next row

//Display all data from array
int index=0;
for(ArrayList<String> row : outterArray){
    Log.w(TAG,"(Row"+index+") " + row.get(0) + " | "+row.get(1)+ " | "+row.get(2));
    index++;
}
于 2014-03-01T02:08:05.167 に答える