2015-01-20 28 views
-4

考虑下面的代码添加相同的匿名对象单独集合

ArrayList<SomeObject> One = new ArrayList<SomeObject>(); 
ArrayList<SomeObject> Two = new ArrayList<SomeObject>(); 

One.add(new SomeObject()); 

是否有可能也添加此对象的第二列表,而无需创建它的非匿名?

+0

编写一个名为addToLists的函数,它接收列表和对象列表,并将该对象添加到每个列表。 – Blorgbeard 2015-01-20 21:56:46

回答

2

如果你不想做一个非匿名参考对象,你必须得到它的2种方式。

  1. 从列表中得到它(好,如果你有一个标识符,并且只需要一个对象)
  2. 从一个列表添加的所有对象到另一个(好,如果你想在列表中的所有对象)

对于第一种方法,您可以循环访问列表,直到找到该对象的某种标识符(例如一个id),然后将其添加到第二个列表中。如果您没有明确的标识符,这将不起作用,因为您无法分辨是否添加了正确的项目。这种方法的一个例子是:

for(Object o : one){ 
    if(o.getId() == someId){ 
     two.add(o); 
    } 
} 

至于第二种方法,在JavaCollections包含addAll()方法。这将通过采集一个集合的所有内容并将它们添加到其他集合来工作。如果你有一个项目的列表,或者你需要从一个列表到另一个列表的所有项目,这只会工作得很好。您无法使用此方法专门针对单个对象。如何做到这一点的一个例子是:

one.addAll(two); 

或者,如果你知道你要复制的项目总是会在你采取它在列表中的第一个项目,你可以在项目复制索引0从一个列表到另一个列表。这只有在您确定它始终位于索引0时才有效,因此不建议使用。这方面的一个例子是:

two.add(one.get(0)); 

随着编译器如何为Java工作,您不必担心匿名创建变量,因为大多数编译将转化匿名参照非匿名参考,至少从我的经验。

0

可能永远是厚脸皮,做..

secondList.add(firstList.get(0)); 

但是,这也只是一个代码可怕的一点。保持一个参考,或者更好的是自己。为什么你的设计需要两个列表中的同一个对象。

0

您可以随时从get它从第一个列表,然后立即到第二个列表。

Two.add(One.get(0)); 

但是,这依赖于它总是第一个列表中的第一个。

创建变量并为其命名没有任何问题。

ArrayList<SomeObject> one = new ArrayList<SomeObject>(); 
ArrayList<SomeObject> two = new ArrayList<SomeObject>(); 

SomeObject someObject = new SomeObject(); 
one.add(someObject); 
two.add(someObject); 

它更具可读性。另外,通过标准的命名约定,Java中的变量名应该以小写字母开头,例如, onetwo

1
ArrayList<SomeObject> One = new ArrayList<SomeObject>(); 
ArrayList<SomeObject> Two = new ArrayList<SomeObject>(); 

SomeObject myNewObj = new SomeObject(); 
One.add(myNewObj); 
Two.add(myNewObj); 
+0

我试图解决一个问题,如果匿名对象的一个​​子集可以一次添加到两个列表中,这将非常有帮助。在这种情况下,命名每一个都是不现实的。 – BeepBeep 2015-01-20 21:49:30

+0

你是什么意思的“匿名对象”? – Amr 2015-01-20 21:50:51

+0

@BeepBeep:为什么命名每一个都不实际?这听起来像你的代码应该重新设计,所以它是_is_。 – 2015-01-20 21:52:04

0

如果其中一个共享对象变为空,它应该从它所在的所有列表中删除。

制片人:

p1.add(work_list); 
p1.add(work_list2); 
p2.add(work_list); 
p3.add(work_list); 
p4.add(work_list); 
p5.add(work_list); 
p6.add(work_list); 
p7.add(work_list); 

消费者:

c[0].add(work_done); 
c[1].add(work_done2); 
c[2].add(work_done);