【问题标题】:Adding and object to a list inside a while loop在while循环内向列表添加和对象
【发布时间】:2014-11-14 11:11:43
【问题描述】:

我正在尝试循环一个列表,该列表内部有 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 objectList,使用模板,不要强制转换
  • 我应该在哪个部分使用那个朋友?
  • ArrayList 而不是使用它,然后再转换它,使用正确的类型

标签: java arrays list loops while-loop


【解决方案1】:

每次您添加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
}

【讨论】:

  • 你确定吗,迭代器迭代得很好,因为我得到了一个具有相同数量值的列表。如果我这样做,我将无法设置我的对象属性
【解决方案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的情况一样,但我还是不知道为什么它一直在添加同一个对象。我正在使用设置器更改其值,所以它不应该添加具有新属性的相同对象吗?或者这只是 Java/OOP 的设计?
  • @Denny 如果你不使用new,你就不会实例化一个新的引用。因此,每个Object 实际上都是相同的Object
【解决方案3】:

在查看了您的代码后,我觉得它看起来不错。
您没有从相关数组中读取数据,即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); 
}

【讨论】:

    【解决方案4】:
    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);
            }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      相关资源
      最近更新 更多