【问题标题】:Add Integer in ArrayList<ArrayList<Integer>>在 ArrayList<ArrayList<Integer>> 中添加整数
【发布时间】:2015-11-11 08:12:30
【问题描述】:

请帮助我在 ArrayList 内的 ArrayList 中添加整数.. 这是代码..

ArrayList<ArrayList<Integer>> player = new ArrayList<ArrayList<Integer>>(10);
ArrayList<Integer> array = new ArrayList<Integer>(10);
array.add(1);
array.add(2);
array.add(3);
array.add(4);
array.add(5);

player.add(array);
player.add(array);

如果我使用调试检查数组和播放器内部的内容..

array[1,2,3,4,5]
player[[1,2,3,4,5],[1,2,3,4,5]]

现在,我想在播放器的 ArrayList 插槽 0 上添加整数:

player.get(0).add(6);

但不是得到这个:

player[[1,2,3,4,5,6],[1,2,3,4,5]]

我明白了:

player[[1,2,3,4,5,6],[1,2,3,4,5,6]]

简而言之,玩家的 ArrayLost 插槽 0 和插槽 1 收到了我添加的整数..

请帮忙..提前谢谢..:)

【问题讨论】:

  • 您添加了相同的 ListString 两次。由于List 数据类型是通过引用对array 所做的所有更改都会影响player.get(0)player.get(1)。要解决这个问题,您需要为player 创建两个不同的Lists。

标签: java arraylist


【解决方案1】:

您将 same ArrayList 添加到玩家 ArrayListboth 条目中。玩家ArrayList的两个条目是完全相同的对象。

你应该再发一个ArrayList

ArrayList<Integer> array2 = new ArrayList<Integer>();

然后将其添加为播放器的第二项ArrayList

【讨论】:

【解决方案2】:
ArrayList<ArrayList<Integer>> player = new ArrayList<ArrayList<Integer>>(10);
ArrayList<Integer> array = new ArrayList<Integer>(10);
array.add(1);
array.add(2);
array.add(3);
array.add(4);
array.add(5);
ArrayList<Integer> array1 = new ArrayList<Integer>(array);
player.add(array);
player.add(array1);

已经回答...

【讨论】:

    【解决方案3】:

    正如其他人提到的,您实际上将相同的元素添加到两个列表中。

    如果您不想用初始值填充两个 ArrayList。您可以保留您的代码,只更改以下几行:

    player.add(array);
    player.add(array);
    

    到:

    player.add(array);
    player.add(new ArrayList(array)); // alternatively player.add(array.clone());
    

    这会为玩家中的第二个条目创建一个新的 ArrayList。

    【讨论】:

      【解决方案4】:

      您的代码的问题在于 - 当您将 array 添加到 player 对象时,您传递了 array 对象的相同引用。

      当你这样做player.get(0)你得到相同的对象ArrayList&lt;Integer&gt; array = new ArrayList&lt;Integer&gt;(10);然后当你添加player.get(0).add(6);你指向array对象的引用并且java通过引用传递对象。见this SO 线程

      【讨论】:

        【解决方案5】:

        那是因为向播放器添加两次数组并没有将数组的值添加到播放器两次,它只是将数组引用的两个副本添加到播放器

        player[[1,2,3,4,5],[1,2,3,4,5]]
        

        真的

        player[array,array]
        

        您可以使用例如 jUnits assertTrue 进行测试:

        assertTrue(player.get(0) == player.get(1))
        

        【讨论】:

        • 这不正确。 Java 是按值传递的!当您将对象传递给函数时,对象引用是按值传递的。
        • 从某种意义上说,是的,从另一种意义上说,不是。它将引用的值传递给对象,这就是你写的,所以是的。但是它将引用传递给对象,这是您(通常)对代码感兴趣的内容。这就是为什么引用传递是一种方便的思维方式,尽管它在技术上是错误的。
        • 在与 Java 初学者交谈时,我会避免整个引用传递与值传递的区别。对于 C、Fortran 等来说,这是一个重要的区别。但它可能只是让初学者完全不知所措。我要强调的是,JAVA 中的 Object 变量本身并不包含文字对象,而是指向该对象的指针。这是对这里错误的一种清晰的思考方式。它还具有技术上正确而不是技术上错误的好处。
        猜你喜欢
        • 2015-01-07
        • 2014-03-23
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 2016-06-28
        相关资源
        最近更新 更多