Scala 将字符串与列表项匹配
我有一个列表和两个字符串:Scala 将字符串与列表项匹配,scala,pattern-matching,Scala,Pattern Matching,我有一个列表和两个字符串: val features = List("one","two","three") val strOne = "one_five" val strTwo = "seven_five" 我想将每个字符串与列表中的项目相匹配 若字符串的开头和其中一个列表项匹配,那个么打印匹配的列表项和字符串本身 如果没有,则无需打印 我有一种方法,我认为它能满足我的需要,但我无法编译它: def getElement(any: String): String = any match
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)
您的解决方案无法编译,因为
:
是列表
方法,s
是字符串。此外,getElement
被声明为返回一个字符串
,因此它应该为任何输入返回一个字符串。所以在第二种情况下,你不能只返回“nothing”
下面是一个替代实现:
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)
您的解决方案无法编译,因为
:
是列表
方法,s
是字符串。此外,getElement
被声明为返回一个字符串
,因此它应该为任何输入返回一个字符串。所以在第二种情况下,你不能只返回“nothing”
下面是一个替代实现:
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)
你不能什么都不还。您承诺您的方法将返回一个
字符串
,因此必须返回一个。您可以返回选项[String]
(首选)或返回单元
,然后自己打印。此外,内置的方法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)
}
你不能什么都不还。您承诺您的方法将返回一个
字符串
,因此必须返回一个。您可以返回选项[String]
(首选)或返回单元
,然后自己打印。此外,内置的方法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)
}
简单的单行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
简单的单行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
模式匹配不是字符串匹配或字符串中的模式匹配。明白你的意思了,10x@Toren
def getElement(str:String):String=features.find(==str.split(“”)(0)).map{elem=>s“$str=$elem”}.getOrElse(“”)
模式匹配不是字符串匹配或字符串中的模式匹配。明白了吗, 10x@Torendef getElement(str:String):String=features.find(==str.split(“”)(0)).map{elem=>s“$str=$elem”}.getOrElse(“”)是一个case类。不公平的是,您可以'a'+:“bc”
但不能s匹配{case'a'+:“bc”=>}
。无论如何,字符串可以被视为Seq[Char]
@tzach-zohar。谢谢我更喜欢返回字符串,我想在找到元素后创建SparkSQL表达式,但我明白了您的观点:
是一个case类。不公平的是,您可以'a'+:“bc”
但不能s匹配{case'a'+:“bc”=>}
。无论如何,字符串可以被视为Seq[Char]
@tzach-zohar。谢谢我更喜欢返回字符串,我想在找到元素后创建SparkSQL表达式,但我明白了你的意思。谢谢!实际上,strOne看起来像strOne=“一一一五”和featuresval features=List(“一一二三”)
。对不起,我这边不清楚。还有一个问题:如果我在功能
列表的对面有一个要检查的字符串列表,会发生什么情况?@Toren您想比较strOne
的哪一部分?在1\u 1\u 5\u 1\u 2\u 3中
。如果您只想先比较一个
然后比较我的代码工作,我想比较一下strOne
和strTwo的乞讨与功能的每一个
如果匹配,然后构造表达式非常感谢!实际上,strOne看起来像strOne=“一一一五”和featuresval features=List(“一一二三”)
。对不起,我这边不清楚。还有一个问题:如果我在功能
列表的对面有一个要检查的字符串列表,会发生什么情况?@Toren您想比较strOne
的哪一部分?在1\u 1\u 5\u 1\u 2\u 3中
。如果您只想先比较一个
然后比较我的代码工作,那么我想将strOne
和strTwo的乞讨与每个特征
进行比较,如果匹配,然后构造表达式