我正在尝试构建一个函数来识别表达式是否具有平衡括号。
我的问题是我的变量opening_index和closing_index的函数出现了这个错误:
Error:(3, 30) identifier expected but integer literal found.
var opening_index: Int =-1
Error:(6, 30) identifier expected but integer literal found.
var closing_index: Int =-1
Error:(34, 30) identifier expected but integer literal found.
var opening_index: Int =-1
Error:(37, 30) identifier expected but integer literal found.
var closing_index: Int =-1
我一直在谷歌搜索我的错误,最后一小时没有找到任何有价值的线索。
这是我的代码:
object Test
{
def balance(chars: List[Char]): Boolean=
{
var opening_index: Int =-1
var closing_index: Int =-1
opening_index=chars.indexOf('(')
closing_index=chars.indexOf(')')
if (opening_index ==-1 && closing_index==-1)
{
true
}
if (closing_index>-1 && opening_index>-1)
{
if (closing_index<=opening_index) return(false)
else
{
balance(chars.drop(closing_index).drop(opening_index))
}
}
else
return (false)
}
}
答案 0 :(得分:4)
令牌器不知道令牌结束或启动的位置。使用一些分隔符,这使得代码对于人类来说也更具可读性:
def balance (chars: List[Char]): Boolean =
{
val opening_index: Int = chars.indexOf ('(')
val closing_index: Int = chars.indexOf (')')
由于您只是初始化您的vars以便再次直接重新初始化它们,您可以通过将它们声明为val来轻松获得一些功能点:
return (false)
对于递归调用,您不必费心 - 它们会生成一对新的值,这些值不会干扰调用上下文的值。
您可能还会注意到,返回语句不需要使用parens return false
进行函数调用,但可以写为object Test {
def balance (chars: List[Char]): Boolean =
{
val opening_index: Int = chars.indexOf ('(')
val closing_index: Int = chars.indexOf (')')
if (opening_index == -1 && closing_index == -1)
{
true // but note the else in the 2nd next line
}
else if (closing_index > -1 && opening_index > -1)
{
if (closing_index <= opening_index)
false
else
balance (chars.drop (closing_index).drop (opening_index))
}
else
false
}
}
,甚至返回关键字也大部分时间都是超级的。< / p>
{{1}}
答案 1 :(得分:1)
当Scala看到=-1
时,它会被标记化(拆分)而不是=
-1
(与您可能熟悉的其他语言一样),但是=-
{ {1}},因为1
是Scala中完美的标识符。
由于=-
尚未见到,因此整个=
必须是一种类型。通过类型的中缀表示法,它等同于Int =- 1
。除=-[Int, 1]
之外,此处必须是类型。要成为一个类型,它应该以标识符开头,这就是错误消息所说的内容。如果您修复了此问题,则会在下一步抱怨未知的1
类型。
答案 2 :(得分:1)
这可以通过计算每个中有多少并查看数字是否匹配来简化:
def balance (chars: List[Char]): Boolean = {
val opening = chars.count(_ == '(')
val closing = chars.count(_ == ')')
opening == closing
}
balance(List('(', ')', '(', ')', '(')) //false
balance(List('(', ')', '(', ')')) //true
如果您希望平衡括号按顺序排列,则可以递归执行:
def balance(chars: List[Char], open: Int = 0): Boolean = {
if (chars.isEmpty)
open == 0
else if (chars.head == '(')
balance(chars.tail, open + 1)
else if (chars.head == ')' && open > 0)
balance(chars.tail, open - 1)
else
balance(chars.tail, open)
}
val x = "(apple + pear + (banana)))".toList
balance(x) //true
val y = "(()(".toList
balance(y) //false
这将遍历列表的每个元素,并添加/减去/名称为open
的变量,直到列表为空,此时如果open
为0,则返回true
否则返回false
。