2010-10-22 83 views
6

我是一个相对较新的Java程序员,我很难从ArrayList中移除多个元素。理想的情况是我想要做这样的事情:如何从Java ArrayList中删除顺序元素?

ArrayList ar1 = new ArrayList(); 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 
ar1.add(...) 

for (int i = 0; i < 2; i++){ 
    ar1.remove(i); 
} 

我觉得迭代器可能有帮助,但我不能找到匹配足够接近我想要做一个例子。任何帮助,将不胜感激。谢谢。

回答

20

这里是你想要做什么:

ar1.subList(0, 2).clear(); 

这种方式建立列表的第2个元素的子列表视图,然后清除该子列表,从原来的列表中删除它们。 subList方法主要存在于这类事情中......在列表的特定范围内进行操作。

+0

+1优秀的答案。 – aioobe 2010-10-22 16:48:48

+0

+1这是API文档建议你做的事情。 (通常可能不如多个“移除”呼叫那样有效)。 – 2010-10-22 16:52:24

+0

除非OP想要移除的项目不是顺序的。取决于细节。 – 2010-10-22 17:41:04

2

如果您有要删除的对象的单独列表,您可以使用Collection.removeAll(toRemove)。

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

如果您收藏是基于索引的,如ArrayList是,你可以叫

remove(index) 

指数在要删除的元素。你可以在一个循环中做到这一点,但要小心,除去所有的指标,作为另一个答案指出。

如果你想要做的就是从列表中删除前两个元素,然后

list.remove(0); 
    list.remove(0); 

应该这样做。

+0

我的错误,我读得太快,以为他是试图阻止重复项目。在这种情况下,removeAll仍然会被终止 – Woot4Moo 2010-10-22 16:41:48

+0

但是'removeAll'会从参数中移除参数中包含的元素的所有匹配项**,这与调用ArrayList中的第一个元素不同。 – aioobe 2010-10-22 16:46:14

+0

@aioobe你是对的。 – hvgotcodes 2010-10-22 17:01:26

5

你当然可以这样做

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    for (int i = 0; i < 2; i++) { 
     ar1.remove(i); 
    } 
    System.out.println(ar1); 

只注意您删除第一个元素后,其他元素转移。因此,打电话

ar1.remove(0); 
ar1.remove(1); 

将有效地从列表中删除第一个和第三个元素。这将删除前两个元素,但:

ar1.remove(0); 
ar1.remove(0); 
+0

这取决于存储在列表中的东西的类型? – 2010-10-22 17:33:44

+0

@Stephen我不好,我弄糊涂了。 – 2010-10-22 17:36:35

3

对于索引清除从列表中,你需要倒数:

for (int i = 1; i >= 0; i--) 

,否则,你的第一除去在转移“上面”它的项目收集和你不会结束删除你认为你正在删除的项目。

1

你可以试试这个:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
int i = 0; 
while (i < 2 && it.hasNext()) { 
    it.next(); 
    it.remove(); 
    i++; 
} 

,或者更一般地说:

List<Whatever> l = new ArrayList<Whatever>(); 
l.add(someStuff); 
Iterator<Whatever> it = l.iterator(); 
while (it.hasNext()) { 
    Whatever next = it.next(); 
    if (shouldRemove(next)) { 
     it.remove(); 
    } 
} 

编辑:我想这取决于如果你想删除特定指数或特定对象。这也取决于你需要多少逻辑来决定是否应该删除某些内容。如果您知道这些指标,请按相反顺序将其删除。如果您有一组要删除的对象,请使用removeAll。如果您想迭代列表并删除与谓词匹配的对象,请使用上面的代码。

+1

啊,是的。谢谢,埃里克。 StackOverflow确实需要一个内置于答案窗格中的编译器,以便我们可以测试我们的代码:) – 2010-10-23 11:05:27

2

如果你知道你要删除的项目的索引,可以按相反的顺序删除它们,而不必担心转移指标:

ArrayList ar1 = new ArrayList(); 
    ar1.add("a"); 
    ar1.add("b"); 
    ar1.add("c"); 
    ar1.add("d"); 

    int[] indexesToRemove = {0,2,3}; 
    Arrays.sort(indexesToRemove); 
    for (int i=indexesToRemove.length-1; i>=0; i--) { 
     ar1.remove(indexesToRemove[i]); 
    }