在while循环中将对象添加到列表中

3
我试图循环一个包含4个数组的列表,每个数组中有7个值。
我正在遍历这个列表,当我从列表中获取一个数组时,因为我知道每个数组有多少个值,我会像这样分配每个数组索引:personObject.setName(String.valueOf(myArray[0]) 然后在while循环结束时,我将personObject添加到Person列表中,如此添加: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); 
}

当我打印人员列表时,列表中充满了姓名、姓氏和昵称相同的人员,这是一个充满了相同值对象的列表。

尝试使用ArrayList<String[]> objectList,并使用模板,不要进行强制转换。 - Kalpesh Soni
我应该在哪个部分使用那个朋友? - stackUser2000
使用正确的类型,而不是使用ArrayList<Object>,然后再进行强制转换。 - Kalpesh Soni
4个回答

3
每次添加一个 Person 时,您都希望添加一个不同的人,对吗?
因此,您应该在每次循环中创建一个新的 Person 对象。 而不是只创建一个在循环外部的对象,然后不断更改其数据。
// 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
}

你确定迭代器运行良好,因为我得到了一个具有相同数量值的列表。如果我这样做,我将无法设置我的对象属性。 - stackUser2000

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

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


我现在和OP处于相同的情况,但我仍然不知道为什么它会不断添加相同的对象。我正在使用setter更改其值,所以它不应该添加具有新属性的相同对象吗?还是这只是Java/OOP中的设计? - Denny
@Denny 如果你不使用 new,那么你就不会实例化一个新的引用。因此,每个 Object 实际上都是相同的 Object - Elliott Frisch

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

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接