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

