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@Toren
def 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=“一一一五”和features
val features=List(“一一二三”)
。对不起,我这边不清楚。还有一个问题:如果我在
功能
列表的对面有一个要检查的字符串列表,会发生什么情况?@Toren您想比较
strOne
的哪一部分?在
1\u 1\u 5\u 1\u 2\u 3中
。如果您只想先比较一个
然后比较我的代码工作,我想比较一下
strOne
strTwo的乞讨与
功能的每一个
如果匹配,然后构造表达式非常感谢!实际上,strOne看起来像
strOne=“一一一五”和features
val features=List(“一一二三”)
。对不起,我这边不清楚。还有一个问题:如果我在
功能
列表的对面有一个要检查的字符串列表,会发生什么情况?@Toren您想比较
strOne
的哪一部分?在
1\u 1\u 5\u 1\u 2\u 3中
。如果您只想先比较一个
然后比较我的代码工作,那么我想将
strOne
strTwo的乞讨与每个
特征
进行比较,如果匹配,然后构造表达式