Java开发问题:如何移除ArrayList中小于指定值的元素及其后一个元素?
解决ArrayList移除小于10元素及其后一个元素的问题
嘿,我明白你的问题了!你现在需要处理ArrayList,当里面有元素小于10时,不仅要移除这个元素,还要把它后面的那个元素一起删掉,但你当前的代码只是把大于10的元素筛选出来,完全没处理“连带移除后一个元素”的逻辑,而且用for-each循环也没法灵活控制索引,这就是问题的核心所在。
先分析你现有代码的问题
- 你用了for-each循环遍历原列表,这种遍历方式只能逐个获取元素,无法跟踪元素的索引位置,自然也就没法定位到当前元素的下一个元素,更别说处理“移除后一个元素”的需求了。
- 你的逻辑只是把大于10的元素加入新列表,完全没考虑到:如果某个元素小于10,哪怕它后面的元素大于10,也需要一起被移除(比如你示例里的25,本身大于10,但因为前面的4小于10,所以也要被移除)。
解决方案:用普通for循环控制索引
这里给你两种可行的方案,推荐第一种(创建新列表),因为它更安全,不会出现并发修改异常,逻辑也更清晰。
方案1:创建新列表存储结果(推荐)
这种方式不修改原列表,而是遍历原列表,把符合要求的元素加入新列表,遇到小于10的元素时直接跳过当前和下一个元素:
Scanner sc = new Scanner(System.in); int numberOfMeasurements = sc.nextInt(); ArrayList<Integer> measurements = new ArrayList<>(); for(int i = 0; i < numberOfMeasurements; i++) { measurements.add(sc.nextInt()); } ArrayList<Integer> result = new ArrayList<>(); // 手动控制索引i的增量,灵活处理跳过逻辑 for (int i = 0; i < measurements.size(); ) { int current = measurements.get(i); if (current < 10) { // 遇到小于10的元素,跳过当前和下一个元素 i += 2; } else { // 元素符合要求,加入结果列表,移动到下一个元素 result.add(current); i += 1; } } measurements = result; System.out.println(measurements);
代码解释:
- 用普通for循环代替for-each,这样我们可以手动控制索引
i的变化。 - 当遇到小于10的元素时,直接让
i += 2,跳过当前元素和它的下一个元素,不加入结果列表。 - 如果当前元素大于等于10,就把它加入结果列表,然后
i += 1继续处理下一个元素。 - 边界情况也能处理:如果最后一个元素刚好小于10,
i += 2后会超出列表长度,循环自动结束,不会报错。
方案2:直接在原列表上修改
如果你一定要修改原列表,可以用这种方式,但需要注意移除元素后索引的变化(因为移除元素后,后面的元素会前移):
Scanner sc = new Scanner(System.in); int numberOfMeasurements = sc.nextInt(); ArrayList<Integer> measurements = new ArrayList<>(); for(int i = 0; i < numberOfMeasurements; i++) { measurements.add(sc.nextInt()); } // 在原列表上修改,注意索引的调整 for (int i = 0; i < measurements.size(); ) { int current = measurements.get(i); if (current < 10) { // 先移除当前元素,此时后面的元素前移,下一个元素的索引还是i measurements.remove(i); // 如果还有元素存在,移除原来的下一个元素(现在的i位置) if (i < measurements.size()) { measurements.remove(i); } // 移除后不需要i++,因为下一个要处理的元素已经移到i位置了 } else { // 元素符合要求,移动到下一个元素 i++; } } System.out.println(measurements);
代码解释:
- 当移除当前元素后,列表的长度会减1,后面的元素都会前移一位,所以原来的“下一个元素”现在处于索引
i的位置,这时候直接移除i位置的元素即可。 - 移除后不需要执行
i++,因为下一个要处理的元素已经移到了i的位置;如果元素符合要求,就正常执行i++。
内容的提问来源于stack exchange,提问作者user16937037
相关产品推荐
相关产品推荐

