2013-08-26 194 views
3

我有一個列表中包含了相同類型的case類,我在它堅持與標籤的文本文件尋找最好的做法分隔如何將案例類序列化爲製表符分隔的文本文件?

case class mycase1 (x: Int, y:Int , name:String) 
val item1 = new mycase1(1,2,"item1") 
val item2 = new mycase1(3,4,"item2") 
val item3 = new mycase1(5,6,"item3") 

val myList = List (item1,item2,item3) 

是編寫上述數據結構的最佳方式到一個文件?是因爲有這樣一件事:

myList.toFile(delimiter="\t") 
+0

作爲一個Scala提示,不需要'new'關鍵字來創建一個case類的實例。 mycase1(1,2,「item1」)就足夠了 –

回答

6

因爲一個案例類是Product,你可以簡單地使用productIterator的方法得到他們的迭代器被定義的順序字段。您可以使用該列表和map列表mycase1到列表String,然後使用它寫入文件。一個簡單的例子是這樣的:

case class mycase1 (x: Int, y:Int , name:String) 
    val item1 = new mycase1(1,2,"item1") 
    val item2 = new mycase1(3,4,"item2") 
    val item3 = new mycase1(5,6,"item3") 

    val myList = List (item1,item2,item3) 

    val out = new PrintWriter(new FileWriter(pathToMyFile)) 
    try{ 
    myList.map(_.productIterator.mkString("\t")) foreach (out.println(_))  
    } 
    finally{ 
    out.close 
    } 

唯一需要注意的是,該領域做的情況下類的構造函數定義它們的順序(從左至右)獲得輸出。如果你需要另一種方式,我的解決方案將無法工作。

+2

您不需要首先轉換列表中的元素,然後將它們打印出來,您可以同時這樣做:'myList.foreach {e => out。 println(e.productIterator.mkString(「\ t」))}' – Marth

+2

當然可以,但答案中提供的方法稱爲「推遲副作用」,這樣副作用(打印輸出)稍後發生換言之,無副作用的代碼放在'map'中,並且僅對副作用使用'foreach') –

相關問題