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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:04