2013-11-15 79 views
0

我想打印出添加到鏈接列表的對象的內容。在這段代碼中,我預期的o/p是:100 20 300,但我得到:300 300 300.我哪裏出錯了?當LinkedList類型爲用戶定義的對象時,我們如何在java中的LinkedList中進行迭代?

import java.util.*; 
import java.lang.*; 
import java.io.*; 


class Body{ 
int i; 
public void setB(int i){ 
this.i = i; 
} 
} 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 




    Body b = new Body(); 
    Body bdum; 

    LinkedList<Body> l = new LinkedList<Body>(); 

    b.setB(100); 
    l.add(b); 

    b.setB(20); 
    l.add(b); 

    b.setB(300); 
    l.add(b); 

    Iterator<Body> li = l.iterator(); 

    System.out.println(l.size()); 
    System.out.println("List is:"); 

    while(li.hasNext()){ 
    bdum = li.next(); 

    System.out.println(bdum.i); 
} 

} 
} 
+1

[ArrayList的問題(http://stackoverflow.com/questions/18742268/arraylist-issue) –

+0

一個側面說明可能的重複,也可以考慮重寫'在'Body'類中的equals方法時,在比較存儲在列表中的Body對象時是必需的。如果你重寫'equals'重寫'hashCode' – Nishant

回答

3

您創建一個單一的Body對象並將其添加到列表中三次。您應該創建三個不同的對象。那就是:

b.setB(100); 
l.add(b); 

b = new Body(); 
b.setB(20); 
l.add(b); 

b = new Body(); 
b.setB(300); 
l.add(b); 
3

的問題是在這裏:

b.setB(100); 
l.add(b); 

b.setB(20); 
l.add(b); 

b.setB(300); 
l.add(b); 

您使用的變量b相同的對象引用。你至少應該創建一個新的對象引用並賦值,然後將它添加到你的列表中。

一個可能的解決方案是:

b.setB(100); 
l.add(b); 

b = new Body(); 
b.setB(20); 
l.add(b); 

b = new Body(); 
b.setB(300); 
l.add(b); 

另一種解決方案可能會在你的類的構造函數,將設置在Bodyi領域:在你的類

class Body{ 
    int i; 
    //added for compatibility with current code 
    public Body() { 
    } 
    public Body(int i) { 
     setB(i); 
    } 
    public void setB(int i){ 
     this.i = i; 
    } 
} 

然後你直接添加Body的新實例:

//b.setB(100); 
l.add(new Body(100)); 

//b.setB(20); 
l.add(new Body(200)); 

//b.setB(300); 
l.add(new Body(300)); 
1

在此代碼:

Body b = new Body(); 
    Body bdum; 

    LinkedList<Body> l = new LinkedList<Body>(); 

    b.setB(100); 
    l.add(b); 

    b.setB(20); 
    l.add(b); 

    b.setB(300); 
    l.add(b); 

你可能會認爲你已經添加3項爲LinkedList,但實際上只有被加入列表,因爲你一個項目重新使用相同的對象引用多次。

1

您正在更改b的同一實例上的值。您需要創建不同的實例,並像設置值:

Body b1 = new Body(); 
    b1.setB(100); 
    l.add(b1); 

    Body b2 = new Body(); 
    b2.setB(20); 
    l.add(b2); 

    Body b3 = new Body(); 
    b3.setB(300); 
    l.add(b3); 
相關問題