2012-12-03 50 views
0

時,當我們需要一個字符串數組要連接,我們可以使用mkString方法:斯卡拉:打印分離使用輸出流

val concatenatedString = listOfString.mkString 

然而,當我們有一個很長的字符串列表,讓連接字符串可能不是一個好的選擇。在這種情況下,這將是更多的撥款以直接打印輸出到輸出,將其寫入到輸出流很簡單:

listOfString.foreach(outstream.write _) 

不過,我不知道一個巧妙的方法追加分隔符。我試過的一件事是循環索引:

var i = 0 
for(str <- listOfString) { 
    if(i != 0) outstream.write ", " 
    outstream.write str 
    i += 1 
} 

這樣的作品,但它太羅嗦了。儘管我可以使用一個函數來封裝上面的代碼,但我想知道Scala API是否已經有一個函數執行相同的操作。

謝謝。

回答

1

自我解答

我寫了一個函數在原始問題中封裝了代碼:

implicit def withSeparator[S >: String](seq: Seq[S]) = new { 
    def withSeparator(write: S => Any, sep: String = ",") = { 
    var i = 0 
    for (str <- seq) { 
     if (i != 0) write(sep) 
     write(str) 
     i += 1 
    } 
    seq 
    } 
} 

您可以使用它像這樣:

listOfString.withSeparator(print _) 

分離器也可以被分配:

listOfString.withSeparator(print _, ",\n") 

謝謝大家回答我。我想用的是簡潔而不是太慢的表示。 Separator的隱式函數看起來像我想要的東西。所以我接受我自己的回答這個問題。再次感謝你。

1

我相信你想要的是重載的定義mkString。的mkString

定義:

scala> val strList = List("hello", "world", "this", "is", "bob") 
strList: List[String] = List(hello, world, this, is, bob) 

def mkString: String

scala> strList.mkString 
res0: String = helloworldthisisbob 

def mkString(sep: String): String

scala> strList.mkString(", ") 
res1: String = hello, world, this, is, bob 

def mkString(start: String, sep: String, end: String): String

scala> strList.mkString("START", ", ", "END") 
res2: String = STARThello, world, this, is, bobEND 

編輯 這個怎麼樣?

scala> strList.view.map(_ + ", ").foreach(print) // or .iterator.map 
hello, world, this, is, bob, 
+0

也是另一種方法,有時,它是有用的使用'mkString(firstDel,德爾,lastDel) ' –

+0

不,我想要做的是直接寫入輸出流,沒有得到連接字符串,因爲我有很長的連接列表。 – pocorall

+0

已編輯,是你想要的嗎? – adelbertc

4

這裏是你在一點更優雅的方式想要的東西是做一個函數:

def commaSeparated(list: List[String]): Unit = list match { 
    case List() => 
    case List(a) => print(a) 
    case h::t => print(h + ", ") 
       commaSeparated(t) 
} 

遞歸避免可變的變量。

爲了使它更加實用的風格,你可以在你想在每個項目上使用該功能通過,即:

def commaSeparated(list: List[String], func: String=>Unit): Unit = list match { 
    case List() => 
    case List(a) => func(a) 
    case h::t => func(h + ", ") 
       commaSeparated(t, func) 
} 

然後通過調用它:

commaSeparated(mylist, oustream.write _) 
+0

謝謝。你的代碼看起來不錯。 – pocorall

2

的並行代碼並不好,但在其他方面:

val it = listOfString.iterator 
it.foreach{x => print(x); if (it.hasNext) print(' ')} 
1

下面是避免了VAR

listOfString.zipWithIndex.foreach{ case (s, i) => 
    if (i != 0) outstream write "," 
    outstream write s } 
+0

好,你的代碼更乾淨 – pocorall