添加和对象while循环内的列表

时间:2014-09-19 19:21:47

标签: java arrays list loops while-loop

我正在尝试循环列表,该列表中有4个数组,每个数组都有7个值

我正在循环列表,然后当我从列表中获取一个数组时,因为我知道有多少值有数组我分配每个数组索引如下: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); 
}

当我打印我的人名单时,列表中的人名相同,名字,姓名和昵称是一个列表,其中包含相同值的相同对象。

4 个答案:

答案 0 :(得分:3)

每次添加Person时,您想要添加不同的人吗?

因此,您应该每次在循环中创建一个 new 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
}

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

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

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

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

    }

}