【发布时间】:2019-01-09 14:23:49
【问题描述】:
目标:
给定一个字符串的形式 val strang = "ab(cde(fgh)ijk)lmn)opq)rs"
首先我想构造一个由“(”和“)”字符分割的字符串向量。这是通过,
val regexPattern = "((?<=\\()|(?=\\())|((?<=\\))|(?=\\)))"
val data: Vector[String] = strang .split(regexPattern ).map(_.toString).toVector
请注意,实际的字符串会更加多样化,但它是如何拆分的。
其次,这是我需要帮助的困难部分。我想遍历数据向量并用以下逻辑构造一个嵌套向量(下面是psudo-codish)
val newVector =
for(row <- data) {
if(row == "(") // opening angle bracket
start constructing a nested vector inside of newVector
keep appending to the nested vector until we encounter a ")"
character (closing parenthesis).
IF before encountering a ")" we encounter another "(" then
create another nestedVector inside the previous nested vector
and keep appending to it until a closing parenthesis ")" is
encountered
else if(row == ")")
if we encounter a closing parenthesis, go up one level of the nested
vectors
else
simply append this row to the new vector
newVector :+ row
}
我在这方面做了很多尝试,但都取得了有限的成功。使用递归函数,我只管理一层嵌套,但要超越它,我最终使用了 while 循环,这似乎有点过头了。嵌套向量可以是特殊类型。例如,我尝试过 case class Rowy(row: String, rows: Vector[Vector[String]]) 或者 case class Rowy(row: String, rows: Vector(Rowy))
我对 scala 比较陌生,我想知道是否有一种优雅的方法可以使用 scanLeft 或 foldLeft 方法来解决这个问题。任何帮助将不胜感激。
PS:我不使用实际的 for 循环来遍历“数据”向量,而是使用递归函数。 for 循环只是为了传达正在发生的迭代。任何帮助将不胜感激。
【问题讨论】:
-
这只是一个学术研究问题还是一个实际问题?在后一种情况下,您将如何使用已解析的数据结构?除了不是很有用的
Vector[Any]之外,没有任何简单的标准类型可以包含这样的数据结构,因此您需要一个自定义的类型,并且根据您的使用场景对其进行定制可能会有意义。 -
术语说明:这些是括号,而不是尖括号(尖括号是
<和>)。 -
您的正则表达式模式可以简化:
"((?<=[()])|(?=[()]))"