在我的程序中,我有一个List of Strings
和一个List of integer values
应该从第一个列表中删除。想想这样的事情:
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);
当然,我可以使用此代码遍历列表并删除项目:
for (int i = 0; i < del.size(); i++)
{
items.remove(del.get(i));
}
但这是问题所在。删除第一个元素后,索引被移动,所以我删除了错误的项目。对此有优雅的解决方案吗?
答案 0 :(得分: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]添加了必要的演员:)
答案 1 :(得分:1)
你有几个选择,但其中两个更简单:
首先删除最大的索引。在执行此操作之前,请按降序对索引列表进行排序。
如果由于某种原因对索引列表进行排序是不可行的,并且您的字符串列表通常不包含null
,请先用null
替换要删除的所有项目,然后删除所有null
来自字符串列表(例如while (items.remove(null)) ;
)。
答案 2 :(得分:0)
平滑?我不这么认为。一个可行的解决方案是确保您的del list已排序,然后通过并递减所有后续索引,以便它们同步备份。
更好的解决方案是使用问题域特有的密钥来删除,而不是使用数组索引。那将是一个优雅的解决方案。