2013-10-11 25 views
2

我無法從列表中檢索數據。這些值永遠不會被存儲,或者對象被初始化? 我做存儲一些變量的類:將對象存儲到列表中不適用於Java?

public class storage{ 
    public int a = 0; 
    public int b = 0; 
} 

然後我創建了另一個類填充a和b的一些價值觀,並在列表存儲對象

public class anotherclass{ 
     public List<storage> alldata = new ArrayList<storage>(); 

     public void filldata(){ 
      storage tmp = new storage(); 
      for (int i = 1; i <= 10; i++){ 
       tmp.a = i; 
       tmp.b = i; 
       alldata.add(tmp); 
      } 
     } 
} 

但是當我運行filldata ()在我的主類中,然後嘗試從列表中獲取對象a和b仍然設置爲0.

public static void main(String[] args){ 
    anotherclass obj = new anotherclass(); 
    obj.filldata() 

    for (int i = 0; i <= obj.alldata.size() - 1; i++){ 
      System.out.println(obj.alldata.get(i).a) 
      System.out.println(obj.alldata.get(i).b) 
      //Outputs as all zeroes 
    } 

} 

這怎麼可能?

+0

什麼是「存儲」類在做什麼?(另外,最好大寫類名的開頭) – Rogue

+0

我想說的第一件事是,類名始終應該以Caps字母開頭。 *嘆*這是什麼*公共靜態主要()* - 發佈給出錯誤的確切代碼。不要在這裏手動輸入代碼。 – SudoRahul

+0

從列表 – Geros

回答

7

嘗試每次創建對象。否則它使用相同的對象。所以只有它不會添加到你的列表中。的

  storage tmp = null; 
      for (int i = 1; i <= 10; i++) 
      { 
       tmp = new storage(); 
       tmp.a = i; 
       tmp.b = i; 
       alldata.add(tmp); 
      } 

代替

  storage tmp = new storage(); 
      for (int i = 1; i <= 10; i++) 
      { 
       tmp.a = i; 
       tmp.b = i; 
       alldata.add(tmp); 
      } 
+0

這也是我的想法,但它並不能解釋爲什麼他目前得到所有0而不是全部10(這是什麼 - 應該來自發布的代碼)。我懷疑有東西丟失 – torquestomp

+0

OP的發佈代碼是僞代碼(我在主要方法中看到很多語法錯誤)。也許「全零」只是一個僞結果? –

+0

@MikeGodin我知道,他們錯過了一些東西,如果我們提到他們只是編輯和修改。他們評論後仍然收到樣本問題。 – newuser

2

下面的線應該是在filldata()方法您for循環中。

storage tmp = new storage(); 

因爲每次你需要創建一個新的對象添加到你的列表。在你的情況下,同一個對象正在被新值覆蓋。

此外,main方法的語法是錯誤的。它應該是

側面說明:複製從IDE這樣粘貼錯誤代碼。請不要在這裏輸入。你的代碼有很多編譯問題(語法錯誤,缺少分號等)。我之所以這樣說是因爲我提到的解決方案是針對所有* 10 * s作爲輸出而不是* 0 * s的情況。如果你得到* 0 * s,那麼你發佈的代碼並不是解決這個問題的代碼。

+0

你的主要方法和OP的主要方法看起來一樣 – SpringLearner

+0

@javaBeginner - OP編輯了那個。看看問題的編輯歷史! – SudoRahul

+0

只是顯示答案和問題,並得到了疑問,所以問 – SpringLearner

0

這是你的程序,它打印所有10s(而不是0,如你所說)是錯誤的。根據@newuser的回答修改

import java.util.*; 

class storage{ 
    public int a = 0; 
    public int b = 0; 
} 

public class anotherclass{ 
     public List<storage> alldata = new ArrayList<storage>(); 

     public void filldata(){ 
      storage tmp = new storage(); 
      for (int i = 1; i <= 10; i++){ 
       tmp.a = i; 
       tmp.b = i; 
       alldata.add(tmp); 
      } 
     } 

public static void main(String[] args){ 
    anotherclass obj = new anotherclass(); 
    obj.filldata(); 

    for (int i = 0; i <= obj.alldata.size() - 1; i++){ 
      System.out.println(obj.alldata.get(i).a); 
      System.out.println(obj.alldata.get(i).b); 

    } 

} 

} 
1

filldata()方法中存在指針缺陷。您只創建了一個對象tmp,並將相同的對象添加到整個列表中。列表中的所有條目都指向同一個對象。要解決您的問題,您應該先爲每個條目創建一個新對象。

更換你filldata()有:

public void filldata(){ 
     storage tmp; 
     for (int i = 1; i <= 10; i++){ 
      tmp = new storage(); 
      tmp.a = i; 
      tmp.b = i; 
      alldata.add(tmp); 
     } 
    } 
+0

這似乎是問題所在。感謝 – rambodash

+0

+1爲您的工作 – newuser

0

希望這會幫助你,甚至上面的代碼已得到內部類的靜態引用錯誤。 下面的例子有new storage();for循環,它創建一個新的對象,並在每次迭代時取值新的a和b值。

import java.util.ArrayList; 
import java.util.List; 

public class StackClass { 

class Storage { 

    public int a = 0; 
    public int b = 0; 
} 

public class AnotherClass { 

    public List<Storage> allData = new ArrayList<Storage>(); 

    public void fillData() { 

     for (int i = 1; i <= 10; i++) { 
      Storage tmp = new Storage(); 
      tmp.a = i; 
      tmp.b = i; 
      allData.add(tmp); 
     } 
    } 
} 

public static void main(String[] args) { 

    StackClass stack = new StackClass(); 
    AnotherClass obj = stack.new AnotherClass();   

    obj.fillData(); 

    for (int i = 0; i <= obj.allData.size() - 1; i++) { 
     System.out.println("Objec[" + i + "].a-" + obj.allData.get(i).a); 
     System.out.println("Objec[" + i + "].b-" + obj.allData.get(i).b); 

    } 
} 
}