Swift2 坐标字符串解析
嗨,我对斯威夫特比较陌生。我想建立一个数组,其中包含一个数组的元组从字符串如下所示。每个数组中的元组计数并不总是恒定的。最后的数据结构将是: (双倍,双倍)] 要分析的字符串: “((2363448.9 5860581.3,2363438.0 5860577.9),(2363357.5 5860494.7,2363303.2 5860502.0,2363282.5 5860502.5),(2363357.5 5860494.7),(……等)) 我想知道是否有人对最好/最有效的方法有什么想法。我正在考虑遍历原始字符串,并根据遇到的字符设置标志。然后为东行和北行构建字符串。但我不确定这是否是最好的方式,而且似乎过于复杂。 效率是一个因素,因为字符串有时可能相当大 --更新 这是我到目前为止的代码,它似乎是有效的。对改进或更好的方法的想法是值得赞赏的,因为代码有点凌乱。感谢迄今为止帮助过我们的每一个人Swift2 坐标字符串解析,swift2,Swift2,嗨,我对斯威夫特比较陌生。我想建立一个数组,其中包含一个数组的元组从字符串如下所示。每个数组中的元组计数并不总是恒定的。最后的数据结构将是: (双倍,双倍)] 要分析的字符串: “((2363448.9 5860581.3,2363438.0 5860577.9),(2363357.5 5860494.7,2363303.2 5860502.0,2363282.5 5860502.5),(2363357.5 5860494.7),(……等)) 我想知道是否有人对最好/最有效的方法有什么想法。我正
typealias Coordinate = (easting: Double, northing: Double)
typealias Coordinates = [[Coordinate]]
var array = Array<Array<Coordinate>>() //Array of array of tuples(Double)
var tupleArray = [Coordinate]() //Array of tuples(Double)
var tuple: (Double, Double)! = (0, 0)
var easting: Bool = false
var northing: Bool = false
var eastingString: String = ""
var northingString: String = ""
var openBracket = 0
let tempString = getSubstringFromIndex(wktGeometry , character: "G") //string to parse
for char in tempString.characters {
if char == "(" {
openBracket++
if openBracket == 2 {
easting = true
}
} else if char == ")" {
openBracket--
if openBracket == 1 {
tuple.1 = Double(northingString)!
tupleArray.append(tuple)
array.append(tupleArray)
tupleArray = [Coordinate]()
eastingString = ""
northingString = ""
}
} else if char == "," {
if openBracket == 2 {
tuple.1 = Double(northingString)!
tupleArray.append(tuple)
eastingString = ""
northingString = ""
}
} else if char == " " {
if easting == true {
tuple.0 = Double(eastingString)!
easting = false
northing = true
} else {
northing = false
easting = true
}
} else {
if easting {
eastingString += String(char)
} else if northing {
northingString += String(char)
}
} //end if
} //end for
print(array)
typealias坐标=(东距:双精度,北距:双精度)
typealias坐标=[[坐标]]
var array=array()//元组数组的数组(双精度)
var tupleArray=[Coordinate]()//元组数组(双精度)
变量元组:(双精度,双精度)!=(0, 0)
var easting:Bool=false
变量北距:Bool=false
var eastingString:String=“”
var northingString:String=“”
var openBracket=0
让tempString=getSubstringFromIndex(wktGeometry,字符:“G”)//要分析的字符串
对于tempString.characters中的字符{
如果char==”(“{
开放式支架++
如果openBracket==2{
东距=真
}
}如果char==”,则为else{
开放式支架--
如果openBracket==1{
tuple.1=Double(北字符串)!
tupleArray.append(tuple)
array.append(tupleArray)
tupleArray=[坐标]()
eastingString=“”
northingString=“”
}
}如果char==”,则为else{
如果openBracket==2{
tuple.1=Double(北字符串)!
tupleArray.append(tuple)
eastingString=“”
northingString=“”
}
}如果char==“”,则为else{
如果东距==真{
tuple.0=Double(东字符串)!
东距=假
北距=真
}否则{
北距=假
东距=真
}
}否则{
如果向东{
eastingString+=字符串(字符)
}否则,如果北行{
northingString+=字符串(字符)
}
}//如果结束,则结束
}//结束
打印(数组)
基本上[[2363448.9 5860581.3,2363438.0 5860577.9],[2363357.5 5860494.7,2363303.2 5860502.0],[2363282.5 5860502.5,2363357.5 5860494.7],
将使用上面提到的JSON代码。除此之外,您还可以使用一个变量来存储它们,并在使用append时添加它们。除非您拥有的是一个常量,否则它看起来肯定会更干净。代码的问题在于您试图同时完成所有操作。如果将任务拆分为几个小的子任务,则会变得简单得多:
// will parse "2363448.9 5860581.3"
func parseCoordinate(coordinateString: String) -> (Double, Double) {
// possible implementation:
// 1. split string by space,
// 2. assert there are two components
// 3. parse them to Doubles and return them
}
// will parse "(2363448.9 5860581.3, 2363438.0 5860577.9)"
func parseCoordinates(coordinatesString: String) -> [(Double, Double)] {
// possible implementation:
// 1. remove last character "(" and end character ")"
// 2. split the string by "," + remove spaces around results
// 3. call parseCoordinate for every result (e.g. using "map" method)
}
// will parse your whole string
func parse(string: String) -> [[(Double, Double)]] {
// possible implementation
// 1. Use a smart regular expression to split by "," not inside "(" and ")" or just by string "), ("
// 2. call parseCoordinates for every result (e.g. using "map" method)
}
最重要的是:
Array.map
方法这几乎就是JSON。如果您交换了
(
->[
和)
->]
,您可以使用内置的JSON解析代码。好的,非常感谢我会查找它。@特洛伊木马程序执行此操作后,您将得到[[2363448.9 58605881.3,2363438.0 5860577.9],…
这将不是有效数组(缺少逗号).@Eric.同意;错过了。好的,非常感谢我将查找link和Array.map。是的,我同意我的写作方式有点混乱,如果所有案例都涵盖在内的话,可能会出现bug。