在下面的代码中
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 :(得分:1)
你的目标并不完全清楚。也许这很接近。
"A=B&C".split("&").map(_.split("="))
// res0: Array[Array[String]] = Array(Array(A, B), Array(C))
如果您不希望将结果放在.toList
中,则可以使用Array
或其他一些收藏广告。
答案 1 :(得分: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,)
答案 2 :(得分:0)
不确定结果日期类型是否是您想要的,因为您的理解将产生Array
Tuple2[String, Char]
,因为y
在生成时属于Char
类型来自String
x
。生成元组的一种简单方法是按以下方式应用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,""))
如果你必须使用for -reherehension,这是一种方法:
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,""))
答案 3 :(得分: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))
关于for(expressA express B),我不知道如何表达它。