2014-02-25 331 views
0

在我的程序中,我有一个List of Strings和一个List of integer values它应该从第一个列表中删除。想想somehing的是这样的:从arraylist中删除项目

ArrayList<String> items = new ArrayList<String>(); 
items.add("A"); items.add("B"); items.add("C"); 

ArrayList<Integer> del = new ArrayList<Integer>(); 
del.add(1); del.add(2); 

当然,我可以在循环throught与此代码列表中删除的项目:

for (int i = 0; i < del.size(); i++) 
{ 
    items.remove(del.get(i)); 
} 

但这里的问题。在第一个元素被删除后,索引被移动,所以我删除了错误的项目。这是否有一个优雅的解决方案?

+6

按相反顺序删除,先删除较高的索引。 – qqilihq

+4

这是什么'ArrayList del = new ArrayList ();' – Nambi

+0

当然你是对的。感谢那。所以简单的解决方案... – Cilenco

回答

3

在排序由高到低依次删除列表,然后遍历:

Collections.sort(del, Collections.reverseOrder()); 
for (Integer toDelete : del) { 
    // casting to int, because you need #remove(int), not #remove(Object) 
    items.remove((int)toDelete); 
} 

[编辑]修正。对不起,这在开始时被翻了两次。

[EDIT2]增加了必要的投:)

+0

很好的答案,没有想到这一点。此外,请注意我关于使用问题域密钥而不是索引的答案。 – Thom

+0

** edit2问题**:不应该Java自己封装/解包封装器? – Cilenco

+0

不,因为还有一个'#remove(Object)'方法,如果没有明确地转换,这个方法有优先权。 '#remove(Object)'方法会尝试从列表中移除一个'Object',其中'equals(Object)'为'true'; '#remove(int)'另一方面通过索引来删除,这就是你想要的。 – qqilihq

0

优美?我不这么认为。一个可行的解决方案是确保您的del列表已排序,然后通过并减少所有后续索引,以便它们进行同步备份。

更好的解决方案是使用特定问题域的密钥来删除,而不是数组中的索引。那将是一个优美的解决方案。

+1

你对关键的建议是一个很好的建议。但是,对于第一个想法,如果索引列表按降序排序,则不需要同步索引。 –

1

您有几种选择,但有两个简单一些的是:

  1. 首先删除最大的指数。按照降序对索引列表进行排序,然后再执行此操作。

  2. 如果排序的索引列表不是出于某种原因,你的字符串列表可行通常不包含null,首先取代所有你想与null删除然后从字符串列表中的所有null S中的项目(例如while (items.remove(null)) ; )。