2012-02-21 25 views
28

Giả sử có 3 dây:String nối đi chức năng

protein, starch, drink 

Kết nối những, chúng ta có thể nói những gì là cho bữa ăn tối:

Ví dụ:

val protein = "fish" 
val starch = "chips" 
val drink = "wine" 

val dinner = protein + ", " + starch + ", " + drink 

Nhưng nếu một cái gì đó đã mất tích , ví dụ như protein, vì vợ tôi không thể bắt được gì cả. Sau đó, chúng tôi sẽ có: ,chips, drink cho bữa tối.

Có một cách khéo léo để nối các chuỗi để tùy chọn thêm dấu phẩy - Tôi chỉ không biết nó là gì ;-). Có ai có ý tưởng hay không?

Tôi đang tìm một cái gì đó như:

val dinner = protein +[add a comma if protein is not lenth of zero] + starch ..... 

Nó chỉ là một tập thể dục vui vẻ tôi đang làm, vì vậy bây giờ đổ mồ hôi nếu nó không thể được thực hiện trong một số cách mát mẻ. Lý do mà tôi đang cố gắng thực hiện việc kết nối có điều kiện trong một nhiệm vụ duy nhất, là bởi vì tôi đang sử dụng loại điều này rất nhiều trong XML và một giải pháp tốt đẹp sẽ làm cho mọi thứ trở nên đẹp hơn.

Trả lời

40

Khi bạn nói "nó có thể vắng mặt", loại của pháp nhân này phải là Option[T]. Sau đó,

def dinner(components: List[Option[String]]) = components.flatten mkString ", " 

Bạn sẽ gọi nó như thế này:

scala> dinner(None :: Some("chips") :: Some("wine") :: Nil) 
res0: String = chips, wine 

Trong trường hợp bạn hoàn toàn muốn kiểm tra sự trống rỗng của một chuỗi,

def dinner(strings: List[String]) = strings filter {_.nonEmpty} mkString ", " 

scala> dinner("" :: "chips" :: "wine" :: Nil) 
res1: String = chips, wine 
+2

Scala có 'nonEmpty', Java 1.6 có' isEmpty' ... tại sao so sánh độ dài khi tất cả những gì bạn muốn là biết chuỗi có trống hay không? –

+0

Cảm ơn! Tôi đã thay đổi câu trả lời. –

+0

'filterNot (" "==)' ngắn hơn một chút so với 'filter (_. NonEmpty)' –

13

Bạn đang tìm kiếm mkString vào bộ sưu tập, có lẽ .

val protein = "fish" 
val starch = "chips" 
val drink = "wine" 

val complete = List (protein, starch, drink) 
val partly = List (protein, starch) 

complete.mkString (", ") 
partly.mkString (", ") 

kết quả trong:

res47: String = fish, chips, wine 
res48: String = fish, chips 

Bạn thậm chí có thể chỉ định một sự khởi đầu và kết thúc:

scala> partly.mkString ("<<", ", ", ">>") 
res49: String = <<fish, chips>> 
13
scala> def concat(ss: String*) = ss filter (_.nonEmpty) mkString ", " 
concat: (ss: String*)String 

scala> concat("fish", "chips", "wine") 
res0: String = fish, chips, wine 

scala> concat("", "chips", "wine") 
res1: String = chips, wine 

scala> 
+1

Cảm ơn, tôi chưa từng thấy * đang được sử dụng trong Scala. Cho thấy tôi đã ở quanh Scala bao lâu rồi :-p. Nó có tên không? Nhắc tôi về con trỏ trong C++. – Jack

+5

Nó được gọi là "tham số lặp đi lặp lại" trong "cuốn sách cầu thang" ("Lập trình trong Scala" bởi M.Odersky, L.Spoon & B.Venners). Tôi nghĩ rằng "đối số chiều dài biến" là tốt quá. –

+0

Cảm ơn @AlexanderAzarov, điều đó sẽ dạy tôi cách sử dụng sách làm tài liệu tham khảo trước khi đọc bìa để che. Yip, không sao đâu: Trang 156 trong phiên bản in của ấn bản thứ hai, chính xác ;-) – Jack

5

này sẽ chăm sóc của các trường hợp chuỗi rỗng và cũng cho thấy làm thế nào bạn có thể đặt logic khác để lọc và định dạng. Điều này sẽ hoạt động tốt cho một số List[String] và tổng quát thành List[Any].

val input = List("fish", "", "chips", 137, 32, 32.0, None, "wine") 

val output = input.flatMap{ _ match { 
    case None => None 
    case x:String if !x.nonEmpty => None 
    case x:String => Some(x) 
    case _ => None 
}} 
.mkString(",") 

res1: String = fish,chips,wine 

Ý tưởng là flatMap mất một List[Any] và việc sử dụng phù hợp để gán None cho bất kỳ yếu tố mà bạn không muốn giữ lại trong đầu ra. Các Nones bị phẳng đi và Somes ở lại.

Nếu bạn cần để có thể xử lý các loại khác nhau (Int, Double, vv) thì bạn có thể thêm nhiều trường hợp hơn.

+0

+1 cho tính sáng tạo ;-), cảm ơn – Jack

-4
println(s"$protein,$starch,$drink") 
+0

Không, nó không hoạt động, nó sẽ in những thứ sai nếu 'protein' là một chuỗi rỗng. – VasyaNovikov

+0

Chỉ một khối mã không cung cấp câu trả lời hay. Vui lòng thêm giải thích (lý do giải thích vấn đề, sai lầm, v.v.) –

Các vấn đề liên quan