当LinkedList是用户定义的对象类型时,我们如何在java中迭代LinkedList?

时间:2013-11-15 17:14:41

标签: java

我正在尝试打印添加到链接列表的对象的内容。在这段代码中我的预期o / p是:100 20 300但是我得到:300 300 300.我哪里出错?

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); 
} 

} 
}

4 个答案:

答案 0 :(得分: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);

另一种解决方案可能是在您的班级中使用构造函数,在i类中设置Body字段:

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 :(得分: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); 

答案 2 :(得分: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);

您可能认为已向LinkedList添加了3个项目,但实际上只有一个项目被添加到List中,因为您多次重复使用相同的对象引用。

答案 3 :(得分: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);