【问题标题】:calling remove(int) method for an arraylist removes the item from all similar arraylists为数组列表调用 remove(int) 方法会从所有相似的数组列表中删除该项目
【发布时间】:2013-11-19 05:24:42
【问题描述】:

好吧,我不是专业程序员,所以我的问题可能听起来很傻。

我有这个代码:

ArrayList<Integer> list1 = new ArrayList<Integer>();
list1 = list2;

请注意list2[1, 2, 4] 中包含三个项目。所以现在,list1 里面有相同的项目。 但是当我调用remove(index) 方法时。它会从 both ArrayLists 中删除该项目。

这是我的完整代码:

ArrayList<Integer> list1 = new ArrayList<Integer>();
list1 = list2;
for (int i = 0; i < list1.size(); i++) {
    if (list1.get(i) == practiceId) {
        list1.remove(i);
    }
}

我这样做的目的是解决一个有其他解决方案的问题。我问这个问题只是因为我很好奇,想知道为什么会这样?又如何在不从两个 ArrayList 中删除的情况下删除一项?

另外,我有一些想法为什么会发生这种情况。当我尝试逐步调试代码时,它显示两个 ArrayList 具有相同的id。所以我认为这可能是问题的原因。如果这是真的,那么有没有一种方法可以创建一个新的 ArrayList 并将所有项目放入新的另一个 ArrayList 中,而不必逐个添加所有项目?

【问题讨论】:

  • 只是为了记录,我不认为这是一个愚蠢的问题。我认为这是许多新程序员困惑的根源。

标签: java android arraylist


【解决方案1】:

因此,当您将这两个列表设置为彼此相等时,我认为您所做的并不是您认为自己正在做的事情。那听起来很有趣。当您按照上面的方式进行操作时,实际上是将 list1 的内存地址设置为与 list2 相同。所以现在它们都指向内存中的同一个位置,当您删除它时,它将从两个列表中删除。

有意义吗??

【讨论】:

    【解决方案2】:

    这是因为 ArrayList 存储对象并且你说 list1 = list2 设置它们的引用相同,你需要做的是创建另一个名为 list2 的 ArrayList,这样它们的值而不是它们的引用是相同的,你可以这样做这个。

    list2.equals(list1);
    

    【讨论】:

      【解决方案3】:

      当你在做list1 = list2时,它最终会使两个对象都相同。而在尝试从一个对象中删除项目时,它是从两个对象中删除,因为两个对象具有相同的实例值。

      如果你想复制项目,你可以这样做。

      ArrayList list1 = new ArrayList();

      for (int i = 0; i < list2.size(); i++) {
      
              list1.add(list2.get(i));
      
      }
      

      上面的代码会将列表项从 list2 复制到 list1 并且现在将是不同的对象。 现在您可以对一个列表进行操作,并且不会影响另一个列表

      【讨论】:

        【解决方案4】:

        不要使用 list = list2 来复制数组列表的内容。它只是向原始数组列表添加一个引用。要复制 arraylist 的内容,请使用:

            list1.addAll(list2);
        

        【讨论】:

          【解决方案5】:

          几乎所有提到的答案都有帮助。

          但正如我之前提到的,我不想一个一个地添加元素。有一个答案是:

          ArrayList<Integer> list1 = new ArrayList<Integer>(list2);
          

          不幸的是,这被海报删除了。无论如何,这正是我正在寻找的。干净,一行,不需要额外的方法或循环或任何东西。

          感谢您的回答:)

          【讨论】:

            【解决方案6】:

            希望对你有帮助

            ArrayList<Integer> list1 = new ArrayList<Integer>();
            ArrayList<Integer> list2 = new ArrayList<Integer>();//added 1, 2, 4
            list1 = (ArrayList<Integer>) list2.clone();
            

            【讨论】:

              【解决方案7】:

              当您执行list2 = list1 时,相同的引用被复制到第二个列表中,因此无论您在一个列表中所做的任何更改,都会在另一个列表中发生相同的情况。要成功地做到这一点,你应该使用这个:-

                      list2.addAll(1);
              

              现在,如果您要从 list2 中删除,则只会从 list2 中删除项目,而不会从 list1 中删除

              【讨论】:

                猜你喜欢
                • 2011-07-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-06-10
                • 2019-03-22
                • 1970-01-01
                • 1970-01-01
                • 2021-03-15
                相关资源
                最近更新 更多