我使用下面的代码来说明Array(args)中String元素的数字和运算符。这适用于同时具有运算符和数字的数组(例如" -29")),但不适用于像args = ["-29", "+", "20", - , "15"]
这样的最终元素,而不适用于具有一个元素的数组和包含两个元素的最终元素运算符和数字如args = ["-29", "+", "20", - , "-15"]
,因为它不会分隔最后一个元素。有什么问题?
for index in args.indices {
if (args[index].count > 1 || index == args.endIndex + 1) {
let first = args[index].index(args[index].startIndex, offsetBy: 0)
let second = args[index].index(args[index].startIndex, offsetBy: 1)
if (args[index][first] == "-" || args[index][first] == "+") && (args[index][second] >= "0" && args[index][second] <= "9") {
if (args [index])[first] == "-"
{
args[index].remove(at: first)
args.insert("-", at: index)
}
if (args [index])[first] == "+"
{
args[index].remove(at: first)
args.insert("+", at: index)
}
print ("args after every check op \(args)")
print ("args index is \(index)")
print ("args index is \(args.endIndex)")
}
}
}
答案 0 :(得分:2)
最有问题的部分是您正在尝试修改正在迭代的数组,因此在迭代期间更改其索引。例如,当您在索引0...5
上进行迭代时,在带有符号的第一个数字之后,您的数组实际上将具有索引0...6
,并且迭代将永远不会达到最后一个项目。 / p>
有一些简单的解决方法,例如使用手动while
循环,或者只是从末尾迭代:
for index in args.indices.reversed() {
但是,最好的解决方案是创建一个全新的数组,而不是修改输入数组。此外,代码可以大大简化:
let args = ["-29", "+", "20", "-" , "-15"]
var output: [String] = []
for arg in args {
// if the arg is not a sign followed by a number, push it directly to output
guard arg.range(of: "^[+-]\\d+$", options: .regularExpression) != nil else {
output.append(arg)
continue
}
// split arg to sign and number and push them to output
let secondIndex = arg.index(arg.startIndex, offsetBy: 1)
let sign = String(arg[arg.startIndex])
let number = String(arg[secondIndex...])
output.append(sign)
output.append(number)
}
print(output) // ["-", "29", "+", "20", "-", "-", "15"]