Java中如何动态修改方法传递的ArrayList,添加至新列表并删除原列表元素
问题根因与修复方案
核心问题1:分组后原始列表删除逻辑异常
你当前的groups方法中,newGroup初始化在组循环外部,导致所有组的元素会不断累加到同一个列表中,表面看起来像是原始category列表的元素没有正常删除,实际是旧组的元素一直残留在newGroup里。同时不需要频繁调用trimToSize(),对性能没有正向收益。
核心问题2:Judges列表删除异常
- 优先级为3的判断分支中,你错误使用了外层循环变量
i作为删除索引,写成了Judges.remove(i),会删除错误位置的评委,导致后续操作全部混乱 - 遍历
Judges列表时一边遍历一边删除,普通for循环的j++会跳过删除位置后移的元素,导致部分符合条件的评委没有被遍历到 - 最后一个
else分支逻辑错误,无论评委是否符合当前类别的参与要求,都会被强制分配,不符合业务逻辑
修复后代码
private static ArrayList<ArrayList<String>> Judges = new ArrayList<ArrayList<String>>(); private static ArrayList<String> Chemistry = new ArrayList<String>(); // 调用示例,注意Chem变量需要提前定义赋值 groups(Chemistry, Chem, "Chemistry"); public static void groups(ArrayList<String> category, int projects, String name){ int groups; if (projects % 6 != 0) { groups = (projects / 6) + 1; } else { groups = projects / 6; } for(int i = 1;i <= groups;i++){ // 每个组新建列表,避免旧数据残留 ArrayList<String> newGroup = new ArrayList<String>(); for(int j = 0;j <= 5;j++){ if(!category.isEmpty()){ newGroup.add(category.remove(0)); } } selectJudges(newGroup,name); System.out.println(name + "_" + i + newGroup); } } public static void selectJudges(ArrayList<String> group, String name){ ArrayList<String> assigned = new ArrayList<String>(); // 按优先级从高到低(1-5)匹配评委 for(int priority = 1; priority <=5; priority++){ if(assigned.size() >=3) break; // 用迭代器遍历避免边删边漏的问题 Iterator<ArrayList<String>> iterator = Judges.iterator(); while (iterator.hasNext() && assigned.size() <3) { ArrayList<String> judge = iterator.next(); if(judge.contains(name) && judge.contains(String.valueOf(priority))){ assigned.add(judge.get(0)); iterator.remove(); } } } // 如果优先级匹配完还没凑够3个,可自行补充异常处理逻辑 System.out.println(assigned); }
额外优化建议
- 建议单独定义评委实体类代替
ArrayList<String>存储评委信息,避免用contains判断带来的逻辑漏洞(比如评委姓名刚好叫"Chemistry"或者"1"的情况会导致判断错误) - 可以提前按优先级对评委列表排序,减少匹配遍历的次数
内容的提问来源于stack exchange,提问作者mattgcf
相关产品推荐
相关产品推荐

