2016-12-21 50 views
0

我有一個列表,兩個字符串:匹配字符串列表中的內容

val features = List("one","two","three") 
val strOne = "one_five" 
val strTwo = "seven_five" 

我想每個字符串到列表中的項目相匹配。

如果字符串的開頭匹配列表項之一,則打印匹配的列表項和字符串本身。

如果不是,則無法打印。

我的方法,我覺得讓我需要什麼,但我不能編譯:

def getElement(any: String): String = any match { 
    case s :: rest if features.contains(s) => s + "= " + any 
    case _ => // Nothing 
} 

我想以下幾點:

scala> getElement(strOne) 
      "one_five= one" 

    scala> getElement(strTwo) 
+0

模式匹配不是字符串匹配或字符串中的匹配模式。 – YoungSpice

+0

明白了,10x – Toren

+0

@Toren'def getElement(str:String):String = features.find(_ == str.split(「_」)(0))。map {elem => s「$ str = $ elem「}。getOrElse(」「)' – pamu

回答

1

簡單的一行Scala代碼

查找列表誰是第一部分的項目出現在清單

features.find(_ == str.split("_")(0)).map { elem => s"$str= $elem"}.getOrElse("") 

把上面一行在函數內部。

def getElement(str: String): String = features.find(_ == str.split("_")(0)).map { elem => s"$str= $elem"}.getOrElse("") 

的Scala REPL

scala> val strOne = "one_five" 
strOne: String = one_five 

scala> val str = "one_five" 
str: String = one_five 

scala> features.find(_ == str.split("_")(0)).getOrElse("") 
res2: String = one 

scala> features.find(_ == str.split("_")(0)).map(elem => s"$str= $elem").getOrElse("") 
res3: String = one_five= one 
+0

非常感謝!實際上,strOne看起來像'strOne =「one_one_five_1_2_3」',並具有'val features = List(「one_one」,「two_two」,「three_three」)'。對不起,從我身邊不清楚。還有一個問題:如果我有一個字符串列表來檢查'features'列表中的對象,會發生什麼? – Toren

+0

@Toren你想比較'strOne'的哪一部分?超出'one_one_five_1_2_3'。如果你只想比較第一個'one',那麼我的代碼就可以工作 – pamu

+0

如果匹配,我想比較'strOne'和'strTwo'的每一個'features',然後構造表達式 – Toren

2

您的解決方案不能編譯,因爲::List方法,並且s是一個字符串。此外,getElement宣佈返回String因此它應該返回一個字符串爲任何輸入。所以你不能在第二種情況下返回「無」。

下面是一個可選的實現:

def printElement(any: String): Unit = features 
    .find(s => any.startsWith(s)) // find matching (returns Option[String]) 
    .foreach(s => println(s + "= "+ any)) // print if found 

printElement(strOne) // one= one_five 
printElement(strTwo) 
+0

'::'是一個案例類。不公平地,你可以'''+:'bc''但不匹配{case'a'+:「bc」=>}'。無論如何,字符串可以被看作是'Seq [Char]'。 –

+0

@ tzach-zohar。謝謝 !我更喜歡返回String,我想在查找元素後創建SparkSQL表達式,但是我得到了您的觀點 – Toren

3

你不能只返回什麼。您承諾您的方法將返回String,所以您必須返回一個。您可以退回Option[String](首選)或退回Unit並自行打印。此外,內置方法TraversableLike#find將完成部分工作。

def findFeature(str: String): Option[String] = features.find(_ startsWith str) map { value => s"$str=$value" } 

爲了獲得印刷行爲:

findFeature(str) foreach println 
// or redefine findFeature similarly 

而且,你似乎誤解模式匹配:你不想匹配的字符串;你想匹配列表的元素的字符串。下面是一個使用模式匹配的一個版本:

def getElement(feature: String): Option[String] = { 
    @tailrec def getElem0(feature: String, strs: List[String]): Option[String] = strs match { 
    case s :: _ if s startsWith feature => Some(s"$feature=$s") // Matching case 
    case _ :: rest => getElem0(feature, rest) // Not matched, but more to search 
    case Nil => None // Empty list; failure 
    } 
    getElem0(feature, features) 
} 
相關問題