如何轻松地将一种类型的列表复制到另一种类型?

时间:2009-12-17 01:44:46

标签: java list copy

假设我想将列表A的所有元素复制到列表B中。但列表A中的元素是ExampleClass类型,列表B中的元素是String。

ExampleClass {
    String a;
}

由于ExampleClass有一个属性a,它是一个String,当从ExampleClass转换为String时,我想要将a的值作为表示ExampleClass的String返回。 toString()会这样做吗?在不必遍历所有列表A的情况下,将每个ExampleClass转换为String并将它们添加到列表B中,最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

您必须遍历列表,转换每个元素并将其添加到其他列表。 没有其他办法。 即使您使用某些库来执行此操作,仍然需要完全执行此操作。

至于toString()在这种情况下有意义,这完全取决于你的班级。至少,ExampleClass需要实现toString(),因为默认实现看起来像“ExampleClass @ abc564”,这可能根本没用。 您似乎想要使用其字段a的值。

所以,总结一下

for (ExampleClass e: listA){
    listB.add(e.toString());
}

// and in ExampleClass
public String toString(){
   return a;
}

注意:如果您覆盖toString(),则会在打印课程的任何地方使用此选项,这可能是也可能不是问题。出于转换循环的目的,您也可以使用getA()方法并使用该方法而不是toString()

答案 1 :(得分:1)

你的问题是效率......所以我会回答这个问题。

为了将一个列表复制到另一个列表,从根本上说,除了在某个级别循环遍历所有元素之外,没有办法做到这一点。

现在,如果您只想将String复制为参考,那么您将能够减少分配的内存量并移动。但是某个级别的某个人会循环遍历N个元素,所以它就像你一样容易。

答案 2 :(得分:1)

我过去曾使用过Apache Commons的TransformedList类。它不会复制列表,而是使用转换函数装饰列表。在您的情况下,您的Transformer只会从对象返回a的值。

如果您发现不需要列表的实际副本,请试一试。

答案 3 :(得分:1)

请注意,要回答您之后的一个问题 - toString()不会打印任何有关您班级中字段的内容,除非您覆盖该方法并告诉它这样做。如果不覆盖它,则输出由Object的toString()方法定义(除了“文本表示”之外,API的确切输出不是指定的,但在Sun JRE中是完全限定的类名结合对象的标识哈希码,它本身是从该对象使用的内存地址派生而来的。

一般来说,我不喜欢依赖于自定义类的toString()的特定值,因为它没有真正明确定义值应该是什么,但我当然觉得它应该是人类可读的。在这种情况下,我更喜欢使用明确的getA()方法。