从ArrayList中删除具有特定名称的项目

时间:2012-06-26 16:25:13

标签: java android arraylist

我有一个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”或中间任何地方都有“无传感器”,它们不会被移除。我不能为我的生活找出原因。有什么想法吗?谢谢!

4 个答案:

答案 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方法..它应该解决你的问题