【发布时间】:2014-05-20 01:07:24
【问题描述】:
好的,这是困扰我好几天的概念验证:
假设我有:
List<String> a = new ArrayList<String>();
a.add("foo");
a.add("buzz");
a.add("bazz");
a.add("bar");
for (int i = 0; i < a.size(); i++)
{
String str = a.get(i);
if (!str.equals("foo") || !str.equals("bar")) a.remove(str);
}
这将以列表 ["foo", "bazz", "bar"] 结束,因为它会读取索引 1 处的字符串 ("buzz"),删除它,索引 2 处的字符串 ("bazz" ) 会跳转到索引 1,并且会被绕过而不经过验证。
我想到的是:
List<String> a = new ArrayList<String>();
a.add("foo");
a.add("buzz");
a.add("bazz");
a.add("bar");
for (int i = 0; i < a.size(); i++)
{
String str = a.get(i);
boolean removed = false;
if (!str.equals("foo") || !str.equals("bar"))
{
a.remove(str);
removed = true;
}
if (removed) i--;
}
它应该以这种方式工作(至少在我的脑海中是这样,哈哈),但是搞乱 for 迭代器并不是一个很好的做法。
我认为的其他方式是创建一个“删除列表”并将需要从列表 a 中删除的项目添加到该列表中,但这只是纯粹的资源浪费。
那么,从列表中有效删除项目的最佳做法是什么?
【问题讨论】:
-
你应该使用迭代器。
-
确实我可以删除第二个 if,但是当我想到它时,它有多个 if 可以从列表中删除项目,所以这就是为什么我想到 bool 和第二个 if
-
索引问题除外。你确定 (!str.equals("foo") || !str.equals("bar")) 。对我来说,这个条件总是通过。
-
@mani 你是对的,它应该是 && 。正如我所说,这是一个概念验证代码,而不是真正的代码,所以我错过了。