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

Java列表元素添加异常:pairing方法结果不符合预期排查

问题:Pairing方法生成重复元素,无法得到预期的配对列表

我不是英语母语者,若发现表述错误请指正。我正在开发一个操作列表的算法,但其中的pairing方法存在问题。

问题代码

pairing方法

private List<Terme[]> pairing(List<Terme> right, List<Terme> left) {
        List<Terme[]> res = new ArrayList<Terme[]>();
        int i = 0;
        
        for(Terme element : right) {
            tampon[0] = element;
            tampon[1] = left.get(i);
            System.out.println("liste de tampon["+i+"]: "+tampon[0].getNomC()+", "+tampon[1].getNomC());
            res.add(tampon);
            this.printPair(res);
            i++;
        }
        
        return res;
    }

setDiff方法

public void setDiff(Predicat[] couple) {
        List<Terme[]> liste = new ArrayList<Terme[]>();
        List<Terme[]> res = new ArrayList<Terme[]>();
        liste = this.pairing(couple[0].getPredicatDe(), couple[1].getPredicatDe());
        this.printPair(liste);
        boolean simple;
        
        do{
            res = new ArrayList<Terme[]>();
            for(Terme[] element : liste) {
                if(element[0].isEquals(element[1]) == false) {
                    res.add(element);
                }else if((element[0].isType("Fonction")==true) && (element[1].isType("Fonction")==true)) {
                    for(Terme[] litt : this.pairing(((Fonction) element[0]).getFonctionDe(), ((Fonction) element[1]).getFonctionDe())) {
                        res.add(litt);
                    }
                }
                // 原代码存在未闭合的System.out.println(,属于笔误
            }
            liste = res;
            diff = liste;
            this.printDiff();
            simple = this.isSimple();
        }while(simple == false);
        diff = liste;
    }

实际输出

P(x,x,f(t)), P(y,a,u)
liste de tampon[0]: x, y
Pairing: {{x,y}}
liste de tampon[1]: x, a
Pairing: {{x,a},{x,a}}
liste de tampon[2]: f(t), u
Pairing: {{f(t),u},{f(t),u},{f(t),u}}
Pairing: {{f(t),u},{f(t),u},{f(t),u}}
Diff: {{f(t),u},{f(t),u},{f(t),u}}

期望结果

Pairing: {{x,y},{x,a},{f(t),u}}
Diff: {{x,y},{x,a},{f(t),u}}

问题原因与解决方案

核心问题是你在pairing方法中重复复用了同一个tampon数组对象。列表中存储的是数组的引用,而非数组的副本。每次循环你只是修改了tampon的元素值,然后把同一个引用添加到列表里,导致列表中所有位置最终都指向最后一次修改的数组内容。

只需修改pairing方法,每次循环创建新的数组对象即可:

private List<Terme[]> pairing(List<Terme> right, List<Terme> left) {
        List<Terme[]> res = new ArrayList<Terme[]>();
        int i = 0;
        
        for(Terme element : right) {
            // 每次循环新建独立的数组,避免复用同一引用
            Terme[] currentPair = new Terme[2];
            currentPair[0] = element;
            currentPair[1] = left.get(i);
            System.out.println("liste de tampon["+i+"]: "+currentPair[0].getNomC()+", "+currentPair[1].getNomC());
            res.add(currentPair);
            this.printPair(res);
            i++;
        }
        
        return res;
    }

这样添加到列表中的每个数组都是独立对象,修改新数组不会影响已存入列表的内容,就能得到预期的配对结果。另外记得修正setDiff方法中未闭合的System.out.println(语句,避免编译错误。

若有人对我正在编写的程序感兴趣,可告知我分享方式。

提前致谢。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:54:58