2014-09-19 22 views
3

我试图循环列表和列表里面添加和对象的列表里面有4列和每个阵列有7个值while循环

我循环列表中,然后当我得到一个数组从列表中,因为我知道有多少个值,我分配了每个数组索引,如下所示:personObject.setName(String.valueOf(myArray[0])然后在while循环结束时,我将personObject添加到像这样的列表:listOfPersons.add(personObject)。

我的问题是,我的名单仅得到与同一个对象填充和我知道的4个数组列表里面说我循环有不同的价值观,这是我的代码:

ArrayList<Object> objectList= null; 
objectList= _serviceVariable.getObjects(); <--- this works it returns a list with 4 arrays all with diferent values 

Person myPerson = new Person(); 
List<Person> personsList = new List<Person>; 

Iterator<Object> itr = objectList.iterator(); 

while(itr.hasNext()) 
     { 
Object[] innerObj = (Object[]) itr.next(); 

myPerson.setName(String.valueOf(innerObj [0]) 
myPerson.setLastName(String.valueOf(innerObj [1]) 
myPerson.setNickName(String.valueOf(innerObj [2]) 

personsList.add(myPerson); 
} 

当我打印我的人员列表中充满了具有相同名称,姓氏和昵称的人员,是一个列表,其中包含具有相同值的相同对象。

+0

也尝试使用ArrayList中链表类,使用模板,不要将其丢在 – 2014-09-19 19:29:53

+0

我应该使用哪一部分是朋友吗? – stackUser2000 2014-09-19 19:38:59

+0

ArrayList 而不是使用它,并在以后投射,使用适当的类型 – 2014-09-19 19:39:52

回答

3

每次你加入Person你想添加一个不同人的权利?

因此,您应该在每次循环内创建一个newPerson对象。 不是仅在循环的外部创建一个其数据只是不断变化的循环。

// NOT HERE Person myPerson = new Person(); 
// ... 

while(itr.hasNext()) { 
    Object[] innerObj = (Object[]) itr.next(); 

    Person myPerson = new Person(); // HERE you create a new Person   
    myPerson.setName(String.valueOf(myArray[0]); 
    myPerson.setLastName(String.valueOf(myArray[1]); 
    myPerson.setNickName(String.valueOf(myArray[2]); 

    personsList.add(myPerson); // add the new person to the list 
} 
+0

你确定,迭代器迭代正常,因为我得到一个具有相同数量值的列表。 如果我这样做,我wouldnt能够设置我的对象属性 – stackUser2000 2014-09-19 19:27:00

+0

@ stackUser2000检查出我的编辑 – nem035 2014-09-19 19:30:11

+0

谢谢你是 – stackUser2000 2014-09-19 19:37:47

2

你加入(和修改)相同的对象实例的循环多次,因为你只能创建一个Person例如,移动是进入循环。

// Person myPerson = new Person(); 
// ... 
while(itr.hasNext()) { 
    Person myPerson = new Person(); // <-- HERE! 
    Object[] innerObj = (Object[]) itr.next(); 
    myPerson.setName(String.valueOf(myArray[0]) 
    myPerson.setLastName(String.valueOf(myArray[1]) 
    myPerson.setNickName(String.valueOf(myArray[2]) 
    personsList.add(myPerson); 
} 

而且您将创建多个实例并将它们添加到您的循环中。

+0

我现在在OP的情况相同,但我仍然不知道为什么它不断添加相同的对象。我正在改变它的值与setter,所以不应该添加相同的对象与新的属性?或者这只是在Java/OOP中设计的? – Denny 2016-09-20 21:48:02

+0

@Denny如果你不使用'new',你不会实例化一个新的引用。因此,每个“对象”实际上都是相同的“对象”。 – 2016-09-20 22:03:22

0

查看您的代码后,它在我看来。
您正在从相关数组中读取数据,即innerObj。 取代myArray[0],它应该是innerObj [0]
Person p = new Person()内部循环设置新值,否则它会被覆盖。

while(itr.hasNext()) { 
    Person p= new Person(); // <-- HERE! 
    Object[] innerObj = (Object[]) itr.next(); 
    p.setName(String.valueOf(innerObj [0]) 
    p.setLastName(String.valueOf(innerObj [1]) 
    p.setNickName(String.valueOf(innerObj [2]) 
    personsList.add(p); 
} 
0
public class Foobar { 
    class Person { 
     String name; 

     Person(String name) { 
      this.name = name; 
     } 
    } 

    class SpecialPerson extends Person { 
     SpecialPerson(String name) { 
      super(name); 
     } 
    } 

    public void myFoobar() { 
     List<List<Person>> ListOfPersonsList = new ArrayList<List<Person>>(); 

     List<Person> persons1 = new ArrayList<Person>(); 
     persons1.add(new Person("Foo")); 

     List<Person> persons2 = new ArrayList<Person>(); 
     persons2.add(new Person("Bar")); 

     ListOfPersonsList.add(persons1); 
     ListOfPersonsList.add(persons2); 

     List<SpecialPerson> specials = new ArrayList<SpecialPerson>(); 

     for (List<Person> persons : objectList) { 
      for (Person person : persons) { 
       specials.add(new SpecialPerson(person.name)); 
      } 

     } 

     for (SpecialPerson special : specials) { 
      System.out.println("Name: " + special.name); 
     } 

    } 

}