[英]java arraylist.add overwrites with last value
有這個班
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產品的東西。
當添加新字符串時,雖然我正在創建一個新數組,並且在添加它之后y轉向null的新對象OS,元素將覆蓋最后一個。
例如,如果我有字符串“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);
}
當你在這里將oldOnes
傳遞給ObjetoOS
構造函數時, newObj
將引用與oldOnes
相同的列表,然后當你從oldOnes
刪除元素時,你也將它從newObj's
列表中刪除(因為它們是相同的)。
如果使用String
構造函數,則不會發生同樣的情況,因為原始數據類型(也包括Strings
)在傳遞給方法時會被復制(按值傳遞)。
關於如何在java中傳遞對象有一個很好的解釋: Java是“傳遞引用”還是“傳遞值”?
編輯:每次調用方法時,你的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);
}
}
我可以建議簡化一些代碼嗎? 如果您嘗試將屬性添加到數組列表,則可以創建屬性類。 你可以為atributos創建一個類,給它一些成員等等......然后輕松改變並使atributos成為一個列表來保存aritbutos。 我建議這個班的名字是Atributo。 你試圖在一堂課中做很多事情。 單一責任是關鍵。 一個定義atributo的類,一個用於存儲它們列表的類。 這應該可以解決您的問題並使您的代碼簡單化。 現在,您只能將10個成員存儲到數組列表中,而無需指定要保留的元素數量。 如果不這樣做,它將只保留默認值10,最后一個元素將被覆蓋。
import java.util.ArrayList;
public class Atributos
{
// attributes list
ArrayList<String> atributos = new ArrayList<String>();
// add string to attributes list
public void addAtributos(String atributo)
{
atributos.add(atributo);
}
// add list of strings to attribute list
public void addAtributos(ArrayList<String> atributo)
{
for(String attr : atributo)
{
atributos.add(attr);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.