1

我有一个 ArrayList,它有时可以在不同的位置包含值“时间 (GMT)”、“无”和“无传感器”。我想删除所有这些实例,所以我写了这个小 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
    }
}

出于某种原因,这将删除列表开头的“时间(GMT)”,以及列表末尾的任何“无”或“无传感器”,但如果我的 ArrayList 有“无”或“无传感器” “在任何地方的中间,它们都不会被删除。我无法为我的生活找出原因。有什么想法吗?谢谢!

4

4 回答 4

8

当您删除位置 i 的列表项时,曾经位于 i + 1 的项目将被移动到 i (一切都向 i 移动 1 个单元格)。

但是,在您的下一个 for 循环迭代中, i 变为 i + 1 所以基本上您正在跳过之前在删除操作中从 i + 1 移动到 i 的项目。删除项目时需要减少 i 。

于 2012-06-26T16:30:44.583 回答
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
     }
}
于 2012-06-26T16:35:16.623 回答
1

为了完整起见,我将补充一点,您还可以使用一些方便的方法来执行此类操作:

List<String> toRemove = Arrays.asList("Time (GMT)", "None", "No Sendor");
trackedFieldsMod.removeAll( toRemove );
于 2012-06-26T17:21:49.207 回答
0

只需使用包含字符串的方法..它应该可以解决您的问题

于 2012-06-26T16:34:21.863 回答