繁体   English   中英

如何匹配列表上的正则表达式模式以过滤Scala中的小数点

[英]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
}

要过滤类型为IntDouble元素并保留它们各自的类型,可以尝试这样做。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM