簡體   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