从ArrayList中删除对象而不(隐式)循环遍历它

时间:2016-03-19 10:27:13

标签: java loops arraylist

我循环遍历列表A以找到X.然后,如果找到了X,它将被存储到列表B中。之后,我想从列表A中删除X.因为速度是我的应用程序的一个重要问题,我想从A中删除X而不通过A循环。这应该是可能的,因为我已经知道A在A中的位置(我在第一行找到了它的位置)。我怎么能这样做?

for(int i = 0; i<n; i++) {
        Object X = methodToGetObjectXFromA();
        B.add(X);
        A.remove(X); // But this part is time consuming, as I unnecessarily loop through A
    }

谢谢!

3 个答案:

答案 0 :(得分:2)

不是从yhe方法返回对象,而是返回索引,然后按索引删除:

    int idx = methodToGetObjectIndexFromA();
    Object X = A.remove(idx); // But this part is time consuming, as I unnecessarily loop through A
    B.add(X);

但是,请注意,由于数组元素可能会移动,remove方法可能仍然很慢。

答案 1 :(得分:1)

您可以使用迭代器,如果性能有问题,最好使用LinkedList作为要删除的列表:

public static void main(String[] args) {


    List<Integer> aList = new LinkedList<>();
    List<Integer> bList = new ArrayList<>();
    aList.add(1);
    aList.add(2);
    aList.add(3);

    int value;
    Iterator<Integer> iter = aList.iterator();
    while (iter.hasNext()) {
        value = iter.next().intValue();
        if (value == 3) {
            bList.add(value);
            iter.remove();
        }
    }

    System.out.println(aList.toString()); //[1, 2]  
    System.out.println(bList.toString()); //[3]

}

答案 2 :(得分:0)

如果您存储了要在第二个集合中删除的所有对象,则可以使用ArrayList#removeAll(Collection)

  

从此列表中删除其中包含的所有元素   指定的集合。   的参数:   包含要从此列表中删除的元素的c集合

在这种情况下,只需执行

A.removeAll(B);

退出循环时。

加成

它调用ArrayList#batchRemove,它将使用循环删除对象,但您不必自己动手。