gpt4 book ai didi

java arraylist.add 用最后一个值覆盖

转载 作者:行者123 更新时间:2023-12-02 05:51:03 25 4
gpt4 key购买 nike

有这门课

public class ObjetoOS {

private ArrayList<String> atribute = new ArrayList<String>();

public ObjetoOS (String a){
atribute.add(a);
}

public ObjetoOS (ArrayList<String> a){
atribute = a;
}

我这样使用

public class TablaSimbolica {

private static ArrayList<ObjetoOS> tableOS = null;

public static void addAtributos(ArrayList<String> newOnes){

if (tableOS == null){
tableOS = new ArrayList<ObjetoOS>();
for (String s : newOnes){
ObjetoOS newObj = new ObjetoOS(s);
tableOS.add(newObj);
}
}
else{
ArrayList<ObjetoOS> aux = new ArrayList<ObjetoOS>();
for (ObjetoOS os : tableOS){
ArrayList<String> oldOnes = new ArrayList<String>();
oldOnes = os.getAtributo();
for (String s : newOnes){
oldOnes.add(s);
ObjetoOS newObj = new ObjetoOS(oldOnes);
aux.add(newObj);
newObj = null;
oldOnes.remove(s);
}
}
tableOS = aux;
}

}

基本上:addAtributos 检查数组是否为空。如果是的话,它只是添加字符串,如果不是,我必须将它与新的字符串结合起来,就像 cartisan 产品一样。

添加新字符串时,虽然我创建了一个新数组和一个新 objectOS,添加后它会变成 null,但元素会被最后一个元素覆盖。

例如,如果我有字符串“true”“false”,并且我必须添加“female”“male”,则输出为:

[TRUE, Female]

[TRUE, Male]
[TRUE, Male]

[TRUE]
[TRUE]
[FALSE, Female]

[TRUE]
[TRUE]
[FALSE, Male]
[FALSE, Male]

我不明白我在哪里错过了重点。如果我从 ArrayList tablaOS 或 addAtributos 方法中删除静态,它会给我一个错误。

编辑:解决了!我更改了对象类,创建了一个新的空构造函数和一个使用 for 添加字符串数组的方法。

最终的循环

for (String s : newOnes){
oldOnes.add(s);
ObjetoOS nuevo = new ObjetoOS();
nuevo.addAtribute(oldOnes);
aux.add(nuevo);
oldOnes.remove(s);

最佳答案

您的一些问题如下:

ArrayList<String> oldOnes= new ArrayList<String>(); // This line is pointless
oldOnes= os.getAtributo(); // oldOnes will be overwritten here
for (String s : newOnes)
{
oldOnes.add(s);
ObjetoOS newObj = new ObjetoOS(oldOnes);
aux.add(newObj );
newObj = null;
oldOnes.remove(s);
}

当你在这里经过 oldOnesObjetoOS构造函数,newObj将引用与 oldOnes 相同的列表,当您稍后从 oldOnes 中删除该元素时您还可以将其从 newObj's 中删除列表(因为它们是相同的)。

如果您使用String,则不会发生同样的情况构造函数,因为原始数据类型,还包括 Strings ,在传递给方法时被复制(按值传递)。

这里有关于如何在 java 中传递对象的很好的解释:Is Java "pass-by-reference" or "pass-by-value"?

编辑:还有你的tableOS将指向一个新的 ArrayList<>每次你调用你的方法时,如果我正确理解你的解决方案,这可能更符合你的要求:

...
for (ObjetoOS os : tableOS)
{
for (String s : newOnes)
{
ArrayList<String> oldOnesPlusNewOne = new ArrayList<>();
oldOnesPlusNewOne.addAll(os.getAtributo());
oldOnesPlusNewOne.add(s);
ObjetoOS newObj = new ObjetoOS(oldOnesPlusNewOne);
tableOS.add(newObj);
}
}

关于java arraylist.add 用最后一个值覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com