[英]How do I filter elements in an array that both match a pattern and don't match a second pattern?
[英]How do I match Regex Pattern on List to filter out decimal elements in Scala
我想知道没有创建函数,如何从具有数字和字符串的列表中过滤出数字:
val a = sc.parallelize(List(“cat”,“horse”,4.0,3.5,2,“dog”))
我相信我的问题确实是在寻找如何在Scala中使用正则表达式找出匹配的模式
----于美国东部时间20180302 11pm更新:感谢@Nyavro,这是最接近的答案,我做了如下修改:
val doubles = a.collect {
case v: Double => v
case v: Int => v
}
现在我得到:
res10:Array [Double] = Array(4.0,3.5,2.0)
只是好奇,类型是否可以混入Scala的收集结果中?
感谢所有回复。
使用收集:
val doubles = a.collect {
case v: Double => v
}
要过滤类型为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)
为了帮助理解为什么这是一个非常糟糕的主意,请阅读此问题及其答案。
您可以使用isInstanceOf
来检查列表中的元素是否为字符串。
val l = List("cat","horse",4.0,3.5,2,"dog")
l.filter(_.isInstanceOf[String])
>> List[Any] = List(cat, horse, dog)
正则表达式在这里(很大程度上)无关紧要,因为您没有字符串,您拥有要转换为RDD[Any]
的List[Any]
RDD[Any]
。 (RDD在这里也基本上无关紧要,除了RDD没有filterNot
和Lists之外,我不知道是要保留字符串还是丢弃字符串。)
还要注意, filter
将函数作为参数-在这里有一些函数是不可避免的,即使它是匿名的也是如此(在我的示例中)。
不过,我有点暗示,我已经给出了与您要问的相反的答案,并且您有一个要转换为RDD[Double]
的RDD[String]
RDD[Double]
,扔掉了那些不转换。 在这种情况下,我将尝试将字符串转换为双精度,将其包装在Try
并检查是否成功,并使用结果进行过滤:
def isDouble(s: String) = Try(s.toDouble).isSuccess
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.