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
相关产品推荐
相关产品推荐

