You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java删除List每4个元素为一组的前3个元素方法异常求助

问题描述

需要实现方法逻辑:将传入的字符串列表按每4个元素划分为一组,删除每组的第1、2、3个元素,仅保留每组的第4个元素。当前编写的代码无法正常运行,原有实现代码如下:

public static void reduziereKommentare(List<String> zeilen) {
        if (!zeilen.isEmpty()) {
            if (zeilen.size() % 4 != 0) {
                throw new RuntimeException("Illegal size " + zeilen.size() + " of list, must be divisible by 4.");
            }
            for (int i = 1; i <= zeilen.size() % 4; i++) {
                zeilen.remove(i);
                zeilen.remove(i + 1);
                zeilen.remove(i + 2);
            }
        }
        System.out.println(zeilen);
    }
原有代码问题点
  • 循环条件无效:方法内已经提前校验列表长度必须被4整除,此时zeilen.size() % 4的计算结果恒为0,for循环的判断条件从一开始就不成立,循环体根本不会执行,不会触发任何删除操作。
  • 删除逻辑存在下标偏移问题:List调用remove方法删除元素后,被删位置后方的所有元素会自动向前移动一位,连续多次调用remove删除相邻下标时,实际删除的元素会和预期不符,甚至抛出下标越界异常。
  • 无正确的分组步进逻辑:代码没有实现“每4个元素为一组”的间隔处理逻辑,就算修复循环条件,也只会从列表头部开始连续删除元素,无法实现按组保留第4个元素的需求。
修正后实现

采用从后往前遍历的方式做原地删除,彻底规避删除元素导致的下标偏移问题,同时通过取模判断当前元素是否属于每组需要保留的第4个元素:

public static void reduziereKommentare(List<String> zeilen) {
    if (zeilen.isEmpty()) {
        System.out.println(zeilen);
        return;
    }
    if (zeilen.size() % 4 != 0) {
        throw new RuntimeException("Illegal size " + zeilen.size() + " of list, must be divisible by 4.");
    }
    // 从列表尾部向前遍历,删除操作不会影响未处理的前部元素下标
    for (int i = zeilen.size() - 1; i >= 0; i--) {
        // 下标模4余3的元素对应每组第4个,保留;其余删除
        if (i % 4 != 3) {
            zeilen.remove(i);
        }
    }
    System.out.println(zeilen);
}

内容的提问来源于stack exchange,提问作者Ayoub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:24:12