使用谓词搜索字符串-Scala

使用谓词搜索字符串-Scala,scala,predicate,Scala,Predicate,我很难弄清楚如何搜索带有给定谓词的字符串并确定其在字符串中的位置 def find(x:Char=>Boolean):Boolean={ } 例如,如果x是(='') String=“你好,我的名字是” 它将向计数器中添加2,并返回true计数器: "hi my name is".count (_ == 'm') "hi my name is".toList.filter (_ == 'i').size 布尔值: "hi my name is".toList.exists (_ == 'i'

我很难弄清楚如何搜索带有给定谓词的字符串并确定其在字符串中的位置

def find(x:Char=>Boolean):Boolean={

}

例如,如果x是(='')

String=“你好,我的名字是”

它将向计数器中添加2,并返回true

计数器:

"hi my name is".count (_ == 'm')

"hi my name is".toList.filter (_ == 'i').size
布尔值:

"hi my name is".toList.exists (_ == 'i')

"hi my name is".contains ('j')
职位:

查找的用法:

scala> "hi my name is".find (_ == 'x') 
res27: Option[Char] = None

scala> "hi my name is".find (_ == 's') 
res28: Option[Char] = Some(s)

我猜这就是你想要的

由于
find
是一个高阶函数(HOF)——也就是说,它是一个将函数作为参数的函数——它可能需要应用于
字符串
实例。谓词(
find
的函数参数)确定何时找到要查找的字符,
find
方法报告找到字符的位置。因此,
find
应该返回一个
选项[Int]
,而不是一个
Boolean
,这样您就不会丢失有关在哪里找到字符的信息。请注意,您仍然可以将
选项[Int]
结果更改为
布尔值(使用
true
表示搜索成功,
false
不),方法是对结果应用
.isDefined

请注意,我已将
find
重命名为
myFind
,以避免与内置的
String.find
方法发生冲突(该方法执行类似的工作)

import scala.annotation.tailrec
//隐式类不能是顶级元素,因此它放在对象中。
对象字符串{
//使用附加函数“装饰”字符串。
最终隐式类MyRichString(val s:String)
扩展任意值{
//找到满足谓词p的字符,报告位置。
def myFind(p:Char=>Boolean):选项[Int]={
//辅助功能,用于跟踪当前位置。
@泰勒克
def currentPos(pos:Int):选项[Int]={
//如果已传递字符串的结尾,则返回None。未找到
//字符满足谓词。
如果(位置>=s.length)无
//否则,如果谓词传递当前字符,
//返回位置包裹在一些。
否则如果(p(s(pos)))某些(pos)
//否则,执行另一次迭代,查看下一个字符。
其他当前位置(位置+1)
}
//首先看第一(0)个字符。
当前位置(0)
}
}
}
导入StringUtils_
val myString=“嗨,我的名字是”
myString.myFind(='')//应该报告一些(2)
myString.myFind(='').isDefined//应报告true
myString.myFind(=='X')//应报告无
myString.myFind(=='X').isDefined//应报告false
如果隐式类的使用有点太费劲,您可以将其实现为一个函数,将
字符串作为参数:

def find(s:String,p:Char=>Boolean):选项[Int]={
//辅助功能,用于跟踪当前位置。
@泰勒克
def currentPos(pos:Int):选项[Int]={
//如果已传递字符串的结尾,则返回None。未找到
//字符满足谓词。
如果(位置>=s.length)无
//否则,如果谓词传递当前字符,
//返回位置包裹在一些。
否则如果(p(s(pos)))某些(pos)
//否则,执行另一次迭代,查看下一个字符。
其他当前位置(位置+1)
}
//首先看第一(0)个字符。
当前位置(0)
}
val myString=“嗨,我的名字是”
find(myString,='')//应该报告一些(2)
find(myString,='').isDefined//应报告true
find(myString,=='X')//应报告无
find(myString,=='X')。已定义//应报告false

我建议将字符
search
position
分离为单独的方法,每个方法都利用
String
中的内置函数,并封装在
隐式类中

object MyStringOps {
  implicit class CharInString(s: String) {

    def charPos(c: Char): Int = s.indexOf(c)

    def charFind(p: Char => Boolean): Boolean =
      s.find(p) match {
        case Some(_) => true
        case None => false
      }
  }
}

import MyStringOps._

"hi my name is".charPos(' ')
// res1: Int = 2

"hi my name is".charFind(_ == ' ')
// res2: Boolean = true

您想做的不就是只使用
“hi my name is.”indexOf(“”)
,如果您想要布尔值,那么检查答案是否为>=0?您能提供一些详细信息吗?你提到的这个柜台是什么?string
indexOf
上已经有一个方法,它将返回字符的第一个索引,你需要什么,但它没有给你?@DennisHunziker我已经有了一个函数,你已经提到过了,但是这个函数应该执行相同的任务,但是这次使用一个谓词作为parameter@puhlen计数器只是指出了它的第一个索引character@Ye.Doe哪个柜台?
object MyStringOps {
  implicit class CharInString(s: String) {

    def charPos(c: Char): Int = s.indexOf(c)

    def charFind(p: Char => Boolean): Boolean =
      s.find(p) match {
        case Some(_) => true
        case None => false
      }
  }
}

import MyStringOps._

"hi my name is".charPos(' ')
// res1: Int = 2

"hi my name is".charFind(_ == ' ')
// res2: Boolean = true