2017-08-20 29 views
1

在下面的代碼斯卡拉...產量不包括空字符串

test("duplicatedParamGetsFirst2") { 
    val str = "A=B&C" //"A=B&A=C" 
    val res = for { 
    x <- str.split("&") 
    y <- if(x.indexOf("=") == -1) "" else x.substring(x.indexOf("=") + 1) 
    } yield (if (x.indexOf("=") == -1) x else x.substring(0, x.indexOf("=")), y) 
    res.foreach(x => println(x)) 
} 

我預期的結果(A,B)(C,),但我只(A,B)。我如何解決它?

+0

添加了[解決方案](https://stackoverflow.com/a/45788132/913286)生成一個數組對 –

回答

1

你的目標並不完全清楚。也許這會接近。

"A=B&C".split("&").map(_.split("=")) 
// res0: Array[Array[String]] = Array(Array(A, B), Array(C)) 

您可以使用.toList,或者一些其他集合演員,如果你不想在Array S中的結果。

0

不知道結果日期類型是你想要的,因爲你換的理解將產生Tuple2[String, Char]因爲yArrayStringx產生時會Char類型。生成的元組簡單的辦法是申請split兩次如下:

val str = "A=B&C" 

str.split("&"). 
    map(x => if (x contains "=") x.split("=") else Array(x, "")). 
    map{ case Array(a, b) => (a, b) } 

// res1: Array[(String, String)] = Array((A,B), (C,"")) 

如果必須使用,理解,這裏做到這一點的一種方法:

val res = for { 
    x <- str.split("&") 
} yield if (x contains "=") 
    x.split("=") match { case Array(a, b) => (a, b) } else 
     (x, "") 

// res2: Array[(String, String)] = Array((A,B), (C,"")) 
1

Leo C's solution作品。這裏是另一個片段中,產生對數組,接近的風格融入您的原始代碼:

val s = "A=B&C" 
val res = for { 
    t <- s.split("&") 
    a = t.split("=") 
} yield a(0) -> a.lift(1).getOrElse("") 

res.foreach(println) 
// (A,B) 
// (C,) 
0

的代碼應該是:

val str = "A=B&C" //"A=B&A=C" 
val res = for { 
    x <- str.split("&") 
} yield 
{ 
    val y = if(x.indexOf("=") == -1) "" else x.substring(x.indexOf("=") + 1) 
    (if (x.indexOf("=") == -1) x else x.substring(0, x.indexOf("=")), y) 
} 
res.foreach(x => println(x)) 

關於對(expressA特急B),我不不知道如何表達它。