![](/img/trans.png)
[英]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.