Scala计算字符串中不连续出现的字符

时间:2017-04-25 11:54:03

标签: scala

我有一个包含"word1-word2----word3--word4"的字符串,我想计算在这种情况下-的分隔符,但我想将重复实例计为1({{1 }}将是---),我使用1计算line.count(_ == '-'),我需要它7

由于

编辑: 我有一系列分隔符如下

3

运行时出现以下错误:

  val delimiterMap = scala.collection.mutable.LinkedHashMap[Char, Int]()
  val delimitersList = List(',', ';', ':', '|', '\t','-')
  for (a <- delimitersList)
  delimiterMap += a -> line.replaceAll(a.toString+"+",a.toString).count(_ == a)

所以我认为我使用的replaceAll正则表达式存在问题

3 个答案:

答案 0 :(得分:3)

你可以通过regex&#34; - +&#34;将你的字符串分成数组,它会找到一个或多个符号&#39; - &#39;,然后计算数组的长度减一:

val s = "word1-word2----word3--word4"
val arr = s.split("-+") // Array(word1, word2, word3, word4)
arr.length - 1 // 3

或者,甚至更好,无需减去一个,只需找到所有出现的这个正则表达式:

"-+".r.findAllIn(s).length

由于问题修改而更新:

|是正则表达式的特殊符号。你应该把它写成"\\|"。单\需要加倍\。然后,以这种方式更改地图密钥类型和所有分隔符String s而不是Char s:

val delimiterMap = scala.collection.mutable.LinkedHashMap[String, Int]()
val delimitersList = List(",", ";", ":", "\\|", "\t", "-")

答案 1 :(得分:0)

我不确定我是否完全理解这个问题,但你基本上是在考虑分隔符而不是单词?

离开我的头顶你可以做这样的事情

val s =  "word1-word2----word3--word4"
val nonConsecutiveOccurrences = s.split("[^-]") //filter characters that aren't '-'
  .filterNot(_.isEmpty)//get rid of empty strings
  .map(_.count(_ =='-'))// Array[Int] = Array(1, 4, 2)

执行nonConsecutiveOccurrences.length应生成3

这是非常低效的,但我希望它指出你正确的方向。

答案 2 :(得分:0)

您可以使用正确的正则表达式。

scala> val s = "word1-word2----word3--word4"
// s: String = word1-word2----word3--word4

// now lets use a regex which will match one-or-more "-"
scala> val regex = "-+".r
// regex: scala.util.matching.Regex = -+

scala> val count = regex.findAllIn(s).length
// count: Int = 3