2009-12-17 85 views
0

假设我想将列表A的所有元素复制到列表B中。但列表A中的元素是ExampleClass类型,列表B中的元素是String。如何轻松将一种类型的列表复制到另一种类型?

ExampleClass { 
    String a; 
} 

由于ExampleClass中具有属性一个它是一个字符串,从例如ExampleClass转换为字符串我想要的一个的值被返回作为表示ExampleClass中的字符串时。将toString()做到这一点?不必遍历整个列表A,将每个ExampleClass转换为String并将它们添加到列表B,最有效的方法是什么?

+0

你为什么想这样做?你为什么不循环列表A并阅读每个元素的'a'属性?创建另一个列表有什么意义? – 2009-12-17 01:58:51

+0

@帕斯卡尔:也许他需要有一个名单传递给另一个方法调用? – Thilo 2009-12-17 01:59:33

回答

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

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

为了一个列表复制到另一个列表,从根本上,是没有办法做到这一点,而不是通过在一定程度上的所有元素循环。现在

,你将能够减少多少内存分配,如果你只想字符串复制作为参考四处移动。但是某个层次上的某个人将通过N个元素循环,所以它可以像你一样容易。

1

我已经在过去使用的TransformedList类从Apache的百科全书。它不会创建列表的副本,而是用转换函数装饰列表。在你的情况下,你的Transformer只会返回一个对象的值a

给它一个镜头,如果你发现你并不需要在列表的实际拷贝。

+0

我确实需要一份副本。无论如何,我会看看谢谢。 :) – fent 2009-12-17 02:03:02

1

注意,要回答你的问题,后者一个 - 除非你重写方法,并告诉它这样做toString()不会将您的类中打印有关领域的任何事情。如果不覆盖它,则输出由Object的toString()方法定义(其确切输出未由API指定,而不是“文本表示”,但在Sun JRE中是完全限定的类名与对象的标识哈希码,它自己从该对象使用的内存地址派生)。

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

相关问题