我想知道如果不创建函数,如何从列表中过滤出数字和字符串的数字:
val a = sc.parallelize(List(“cat”,“horse”,4.0,3.5,2,“dog”))
我相信我的问题确实在寻找如何在Scala中使用正则表达式来找出匹配的模式
----更新于20180302美国东部时间晚上11点: 感谢@Nyavro,这是最接近的答案,我稍微修改如下:
val doubles = a.collect {
case v: Double => v
case v: Int => v
}
现在我明白了:
res10:Array [Double] = Array(4.0,3.5,2.0)
只是好奇,可以在Scala的收集结果中混合类型吗?
感谢所有回复。
答案 0 :(得分:2)
使用collect:
val doubles = a.collect {
case v: Double => v
}
答案 1 :(得分:0)
要过滤Int
和Double
类型的元素,并保留各自的类型,您可以试试这个。
a.flatMap {
case v: Int => Some(v)
case v: Double => Some(v)
case _ => None
}
//res0: List[AnyVal] = List(4.0, 3.5, 2)
为了帮助理解为什么这是一个非常糟糕的主意,请阅读this question及其答案。
答案 2 :(得分:-1)
您可以使用isInstanceOf
检查列表中的元素是否为字符串。
val l = List("cat","horse",4.0,3.5,2,"dog")
l.filter(_.isInstanceOf[String])
>> List[Any] = List(cat, horse, dog)
正则表达式(在很大程度上)与此无关,因为你没有字符串,你有一个List[Any]
,你正在变成RDD[Any]
。 (RDD在这里也基本上没有关系,除了RDD没有filterNot
和列表之外 - 我无法判断你是想保留字符串还是丢弃字符串。)
另请注意filter
将函数作为参数 - 这里有一些函数是不可避免的,即使它是匿名的,就像在我的例子中一样。
我有一个想法,我已经给出了与你所要求的相反的答案,并且你想要转换为RDD[String]
RDD[Double]
扔掉那些不能转换的字符串。在这种情况下,我会尝试将字符串转换为双精度数据,将其包含在Try
中并检查是否成功,使用结果进行过滤:
def isDouble(s: String) = Try(s.toDouble).isSuccess