我需要修改ruby中的字符串。具体来说,我正试图从WKT字符串中删除“洞”。孔被定义为第一个括号内的任何一组括号。例如在这个字符串中......
POLYGON ((1 2, 3 4), (5 6, 7 8))
我需要删除, (5 6, 7 8)
,因为这个括号数据是一个洞,逗号和空格不属于除了单独的括号组之外。
我正在避免使用像match
或scan
这样的ruby方法来尝试优化速度并实现O(n)速度。
这是我到目前为止所拥有的。
def remove_holes_from(wkt)
output_string = ""
last_3_chars = [ nil, nil, nil ]
number_chars = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
should_delete_chars = false
wkt.each_char do |char|
last_3_chars.shift
last_3_chars.push(char)
if should_delete_chars == false
if number_chars.include?(last_3_chars[0]) && last_3_chars[1] == ")" && last_3_chars[2] == ","
should_delete_chars = true
next
else
output_string += char
end
end
if should_delete_chars == true
if number_chars.include?(last_3_chars[0]) && last_3_chars[1] == ")" && last_3_chars[2] == ")"
should_delete_chars = false
output_string += char
else
next
end
end
end
output_string
end
我面临的问题是,对于大型多边形,如美国(超过500,000个字符和超过40,000个点),我需要66秒才能完成此操作。您可以在此处找到字符串:https://gist.github.com/cheeseandpepper/9da5ca6ade921da2b4ab
有人能想到我可以使用的这个例子的优化吗?或者可能采取单独的方法?感谢。
答案 0 :(得分:2)
Whelp ...正则表达式赢了!
wkt.gsub(/, \(-?\d.*?\)/, "")
花了我0.003742秒
至于正则表达式
,
文字逗号
文字空间
\(
文字左括号
-?
可选的否定号
\d
任何数字(因为前一个是可选的,我们需要确保我们有一个数字与另一个开括号)
.*
任意数量的任何字符(将是数字,逗号和负号)
?\)
最多并包括一个文字的右括号