2009-12-17 111 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()方法。

相關問題