将相同的匿名对象添加到单独的集合中

时间:2015-01-20 21:40:10

标签: java

考虑以下代码

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

One.add(new SomeObject());

是否可以将此对象添加到第二个列表而不以非匿名方式创建它?

5 个答案:

答案 0 :(得分:2)

如果您不想对该对象进行非匿名引用,则可以通过两种方式获取该对象。

  1. 从列表中获取(如果您有标识符,那么很好,只需要一个对象)
  2. 将一个列表中的所有对象添加到另一个列表中(如果您想要列表中的所有对象,则为“好”)
  3. 对于第一种方法,您可以循环遍历列表,直到您为对象命中某种标识符(例如id),然后将其添加到第二个列表中。如果您没有明确的标识符,这将无法使用,因为您无法判断是否添加了正确的项目。这种方法的一个例子是:

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

    对于第二种方法,Collections中的Java包含addAll()方法。这可以通过获取一个集合的所有内容并将它们添加到另一个集合来工作。只有当您有一个项目列表或者您需要从一个列表到另一个列表的所有项目时,这才能正常工作。您无法使用此方法专门定位单个对象。如何执行此操作的示例将是:

    one.addAll(two);
    

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

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

    编译器如何适用于Java,您无需担心匿名创建变量,因为大多数编译会将匿名引用转换为非匿名引用,至少从我的经验来看。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

总是可以厚颜无耻地做..

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

但那只是一段可怕的代码。维护一个引用,或者更好地保持自己...为什么你的设计需要两个列表中的相同对象。

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

答案 4 :(得分:0)

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

生产者:

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