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

时间:2018-03-02 02:02:35

标签: regex scala

我想知道如果不创建函数,如何从列表中过滤出数字和字符串的数字:

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的收集结果中混合类型吗?

感谢所有回复。

3 个答案:

答案 0 :(得分:2)

使用collect:

val doubles = a.collect {
  case v: Double => v
}

答案 1 :(得分:0)

要过滤IntDouble类型的元素,并保留各自的类型,您可以试试这个。

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