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...) 现在它的工作原理:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Bootstrap响应式前端框架笔记十八——导航滚动监听
- AngularJs UI-Router – 页面刷新$state.current现在为空
- 【WebService】——CXF整合Spring
- webservice-cxf 控制台输出日志的问题
- 在终端中恢复Vim会话后没有语法突出显示
- angular – MdDatepickerModule – 欧洲格式
- anglejs – Angular ng-animate 1.3.*导致ng-class内部指令
- angular – 无法读取未定义的属性’unsubscribe'(rxJS
- angularjs – 嵌套ng-repeat $parent.$index和$index
- angularjs – 如何在Protractor中配置firefox二进制位置?