我有一个ArrayList,有时在各个位置都包含值“Time(GMT)”,“None”和“No Sensor”。我想删除所有这些实例,所以我写了一点for循环:
for(int i = 0; i < trackedFieldsMod.size(); i++ ) {
if(trackedFieldsMod.get(i).equalsIgnoreCase("Time (GMT)") || trackedFieldsMod.get(i).equalsIgnoreCase("None") || trackedFieldsMod.get(i).equalsIgnoreCase("No Sensor")) {
trackedFieldsMod.remove(i); //Don't let users find average/mean/etc for irrelevant fields
}
}
由于某种原因,这将删除列表开头的“Time(GMT)”,以及列表末尾的任何“None”或“No Sensor”,但如果我的ArrayList有“None”或中间任何地方都有“无传感器”,它们不会被移除。我不能为我的生活找出原因。有什么想法吗?谢谢!
答案 0 :(得分:8)
当您移除位置i处的列表项时,以前位于i + 1的项目将移动到i(所有内容都会向i移动1个单元格)。
然而,在你的下一个for循环迭代中,我变成了i + 1,所以基本上你正在跳过那个先前在你的删除操作上从i + 1移动到i的项目。在删除项目时,您需要减少i。
答案 1 :(得分:4)
我通常使用迭代器来执行此操作:
for (Iterator<String> iterator = trackedFieldsMod.iterator(); iterator.hasNext();) {
String string = iterator.next();
if("Time (GMT)".equalsIgnoreCase(string) || "None".equalsIgnoreCase(string) || "No Sendor".equalsIgnoreCase(string)) {
iterator.remove(); //Don't let users find average/mean/etc for irrelevant fields
}
}
答案 2 :(得分:1)
为了完整起见,我将补充说你也可以使用一些便利方法来做这类事情:
List<String> toRemove = Arrays.asList("Time (GMT)", "None", "No Sendor");
trackedFieldsMod.removeAll( toRemove );
答案 3 :(得分:0)
只需使用字符串的contains方法..它应该解决你的问题