簡體   English   中英

java arraylist.add用最后一個值覆蓋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM