我有一个序列说a就像
val a:Seq[Any]=Seq("Hai",1,2,"Hello")
现在我想将此序列拆分为2个不同的序列seqString
,数据类型为String
,seqInt
的数据类型为Int
。
scala> val partitioned =a.partition(p => p.isInstanceOf[String])
这会将我的序列拆分为2个序列Seq("Hai", "Hello")
和Seq(1,2)
。现在假设如果我尝试
scala>partitioned._2.map(x => x+1)
我无法执行此操作,因为分区方法的结果返回Seq[Any]
。
答案 0 :(得分:1)
如果您可以使用多次遍历,请使用collect
语句试用case
:
scala> val a:Seq[Any]=Seq("Hai",1,2,"Hello")
a: Seq[Any] = List(Hai, 1, 2, Hello)
scala> val partitioned = (a.collect{case x: Int => x}, a.collect{case x: String => x})
partitioned: (Seq[Int], Seq[String]) = (List(1, 2),List(Hai, Hello))
scala> partitioned._1.map(_ * 2)
res1: Seq[Int] = List(2, 4)
答案 1 :(得分:0)
我想出了另一种方式。这可以使用foldLeft
完成 a.foldLeft((Seq[String](),Seq[Int]()))((accum,b) =>
b match{
case i:Int => (accum._1,accum._2 :+i)
case s:String => (accum._1 :+s,accum._2)
case _ => accum
})