2014-11-01 32 views
-2

如何将所有元素修改为未知类型的列表?将所有元素修改为未知类型的列表

for (Person person : persons) { 
      person = transformer.transform(person); 
     } 

但是这种结构每次都会产生新的人,我知道这是错误的。我想用迭代器更好,但是,我不知道我该怎么做。请不要给我任何指向javadoc迭代器的链接。 确定,如果它的ArrayList我只需要做这样

for (int i = 0 ; i < persons.size ; i++) { 
       persons[i] = transformer.transform(persons[i]); 
      } 
+2

你是什么意思一个未知类型的列表?你已经知道列表是'Person'的List。你想做什么修改? – Khalid 2014-11-01 19:43:52

+0

你的问题很不清楚。 “未知类型的列表”是什么意思?你的“这个建筑每次创造新人”是什么意思?请花一点时间为您想要实现的目标提供更多背景,理想情况下使用简短但完整的程序。 – 2014-11-01 19:43:56

+0

我的意思是我只知道名单,但我不知道它是以什么为基础的。它mabe ArrayList或任何其他 – jenius 2014-11-01 19:45:55

回答

4

您可以轻松地通过接口List的方法set更换Person的改造实例(也就是每List实现像ArrayListLinkedList支持):

for (int i = 0; i < persons.size(); i++) { 
    final Person person = persons.get(i); 
    persons.set(i, transformer.transform(person)); // replace new instance of "Person" 
    // do other stuff with "person" 
} 

介意的set使用只有必要的,如果transform返回一个新的实例方法。如果它只是修改所提供的实例,那么你只需要遍历列表:

for (Person person : persons) { 
    transformer.transform(person); //just modify the current "Person" instance 
} 
+0

非常感谢你。这正是我需要的 – jenius 2014-11-01 19:54:10

4

首先,你不能重新定义了Java为(obj对象:对象)的元素循环。除非变换()改变Person对象的属性,你必须通过使用其他施工迭代:

for (int i = 0; i < persons.size(); i++) { 
    // use persons.set() here to reassign the index in persons 
} 

而且,你通常不需要知道你到底是什么样的List获得。像List这样的接口背后的想法是,实现它的每个对象都可以在需要List的地方使用。它们的每个属性和方法都是List接口中的属性和方法的超集。

2

为什么不使用番石榴?

Collections2.transform(collection, new Function<Person, Person>() { 
     @Override 
     public Person apply(Person person) { 
      return transformer.transform(person); 
     } 
}); 

但是,它可能会更好,只是修改当前的个人实例。