我在使用多维字符串数组时遇到麻烦,不胜感激。

我将在下面发布一个示例代码,该代码我只是为了解决多维字符串数组的工作原理而编写的。我在评论中写了我期望发生的事情以及结果期望的事情,但事实并非如此。我的问题几乎是为什么它不能按照我的想法工作,它应该创建矩阵
[1] [2] [3]

[4] [5] [6]

另外还有一个问题,如果我已经设置了2x3矩阵,该如何在特定元素中重新分配值,例如[1] [1],还是必须调用该行并将其分配给变量。整个示例代码供我学习如何在多维字符串数组中分配元素,然后重新分配它们。这些字符串数组列表,我不知道提前的维数和值的变化,在那里我需要使用.add方法,最终使用.set。

预先感谢您的任何帮助,令人惊讶的社区,这似乎在Stack Overflow上

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);

}


}

最佳答案

我猜您是在假设向列表中添加内容时会创建数据副本。但是,事实并非如此。该列表将包含对您要添加的数据的引用,而不是实际内容本身(的副本)。

因此,即使下面的注释是正确的,因为您要两次添加“列”对象...

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


...两个列表条目将引用同一对象。然后,通过尝试更改一列的值,实际上是在更改引用的对象,因此也在更改两个条目。因此,您最终得到“ 456456”。

这实际上将影响两列,因为在前两个位置引用了同一对象:

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]


要“修复”此问题,请确保在添加第二列之前创建一个新的“列”对象。或者,如果您希望继续修改同一对象,请确保将数据副本添加到列表中。例如:

//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类。列表对于表示矩阵并不是特别理想。另外,您可能可以学习或借鉴周围的矩阵实现堆。只是一个想法。 :)

10-08 17:23