加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

list – Scala:如何使用多个分隔符进行分割

发布时间:2020-12-16 18:54:08 所属栏目:安全 来源:网络整理
导读:我想知道如何使用 Scala使用多个分隔符来分割字符串. 例如,如果我有一个分隔符列表: List("Car","Red","Boo","Foo") 收获的字符串: Car foerjfpoekrfopekf Red ezokdpzkdpoedkzopke dekpzodk Foo azdkpodkzed 我希望能够输出如下内容: List( ("Car"," foe
我想知道如何使用 Scala使用多个分隔符来分割字符串.

例如,如果我有一个分隔符列表:

List("Car","Red","Boo","Foo")

收获的字符串:

Car foerjfpoekrfopekf Red ezokdpzkdpoedkzopke dekpzodk Foo azdkpodkzed

我希望能够输出如下内容:

List(   ("Car"," foerjfpoekrfopekf "),("Red"," ezokdpzkdpoedkzopke dekpzodk "),("Foo"," azdkpodkzed")     
)

解决方法

有点冗长,但它有效:
弃用版:(它有一个错误,留在这里,因为你已经接受了答案)

def f(s: String,l: List[String],g: (String,List[String]) => Int) = {
    for {
        t <- l
        if (s.contains(t))
        w = s.drop(s.indexOf(t) + t.length)
    } yield (t,w.dropRight(w.length - g(w,l)))
}

def h(s: String,x: String) = if (s.contains(x)) s.indexOf(x) else s.length

def g(s: String,l: List[String]): Int = l match {
    case Nil => s.length
    case x :: xs => math.min(h(s,x),g(s,xs))
}

val l = List("Car","Foo")

val s = "Car foerjfpoekrfopekf Red ezokdpzkdpoedkzopke dekpzodk Foo azdkpodkzed"

输出:

f(s,l,g).foreach(println)
> (Car,foerjfpoekrfopekf )
> (Red,ezokdpzkdpoedkzopke dekpzodk )
> (Foo,azdkpodkzed)

它返回Array [String]而不是list.但你也可以这样做:f(s,g).toList

编辑:
只是注意到如果分隔符只在字符串中出现一次,这段代码就很好了.如果已定义如下:

val s = "Car foerjfpoekrfopekf Red ezokdpzkdpoedkzopke dekpzodk Foo azdkpodkzed Car more..."

我仍然得到相同的结果,而不是另一对(“汽车”,“更多…”)

编辑#2:BUGLESS VERSION这里是固定的片段:

def h(s: String,x: String) = if (s.contains(x)) s.indexOf(x) else s.length

def multiSplit(str: String,delimiters: List[String]): List[(String,String)] = {
    val del = nextDelimiter(str,delimiters)
    del._1 match {
        case None => Nil
        case Some(x) => {
            val tmp = str.drop(x.length)
            val current = tmp.dropRight(tmp.length - nextDelIndex(tmp,delimiters))
            (x,current) :: multiSplit(str.drop(x.length + current.length),delimiters)
        }
    }
}

def nextDelIndex(s: String,nextDelIndex(s,xs))
}

def nextDelimiter(str: String,delimiters: List[String]): (Option[String],Int) = delimiters match {
    case Nil => (None,-1)
    case x :: xs => {
        val next = nextDelimiter(str,xs)
        if (str.contains(x)) {
            val i = str.indexOf(x)
            next._1 match {
                case None => (Some(x),i)
                case _ => if (next._2 < i) next else (Some(x),i)
            }
        } else next
    }
}

输出:

multiSplit(s,l).foreach(println)
> (Car,azdkpodkzed)
> (Car,more...)

现在它的工作原理:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读