鉴于下面的代码,是否可以在Java中使用这种for循环样式从属性列表中删除p
的索引?
List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";
for(Properties p : propertiesList) {
if(p.getKey().equals(keyToDelete)) {
propertiesList.remove(index) //How to remove the element at index 'p'
}
}
这是我用其他for
循环
List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";
for(int i = 0; i < propertiesList.size(); i++) {
if(p.getKey().equals(keyToDelete)) {
propertiesList.remove(i);
}
}
答案 0 :(得分:27)
这样做的方法是明确Iterator
(没有像旧学校那样的学校!)。
Iterator<Properties> it = propertiesList.iterator();
while (it.hasNext()) {
if (it.next().getKey().equals(keyToDelete)) {
it.remove();
}
}
与列表中的remove方法不同,remove
method on the iterator不会导致并发修改。这是从您正在迭代的集合中删除元素的唯一安全方法。正如该方法的javadoc所说:
如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
答案 1 :(得分:8)
不,你需要使用old-school for循环来获取索引。
你当然可以将它自己添加到for-each循环中,但是你很可能会更好地使用旧的变体。
答案 2 :(得分:8)
如何使用正确的Iterator
及其remove
方法?
List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";
for (
Iterator<Properties> iter = propertiesList.iterator( );
iter.hasNext( );
)
{
Properties p = iter.next( );
if(p.getKey().equals(keyToDelete)) {
iter.remove( );
}
}
答案 3 :(得分:2)
正如蒂姆安德森建议你也可以修改循环外的列表
List<Properties> propertiesList = new ArrayList<Properties>();
String keyToDelete = "blah";
List<Properties> propertiesToRemove = new ArrayList<Properties>();
for(Properties p : propertiesList) {
if(p.getKey().equals(keyToDelete)) {
propertiesToRemove.add(p) ;
}
}
propertiesList.removeAll(propertiesToRemove);
答案 4 :(得分:1)
据我所知,foreach循环不保证它枚举的元素的顺序,
所以,如果您尝试使用Collection [i],您可以获得另一个元素,而不是当前迭代的
在一些多线程案例中可以清楚地看到它