class GeoInfo
attr :lat,:lng
end
arr = GeoInfo.find(:all)
这里有个GeoInfo(地理信息)类,分别有两个属性lat,lng(纬度,经度)。
我获得了数据库中所有的地理数据,由于需求这些地理数据会出现大量坐标相同的情况,现在我根据需求,需要把位置相同的数据放在同一个数组中,最后获取一个新的数组。
arr_re = []
arr.each_with_index do |geo_a,index_a|
fg = true
arr_fg = [geo_a]
arr.each_with_index do |geo_b,index_b|
if geo_a.lat == geo_b.lat && geo_a.lng == geo_b.lng && index_a != index_b
arr_fg << geo_b
fg = false if index_a > index_b
end
end
arr_re << arr_fg if fg
end
以上,代码是按照最初的想法实现,需要进行arr.size的平方次循环判断,需要消耗大量的时间来循环。如果数据有100条,那将要循环10000次才能拿到想要的结果。
map_fg = {}
arr.each do |a|
if map_fg["#{a.lat};#{a.lng}"]
map_fg["#{a.lat};#{a.lng}"] << a
else
map_fg["#{a.lat};#{a.lng}"] = [a]
end
end
arr_re = []
for k,v in map_fg do
arr_re << v
end
以上,代码使用hash存储,使用更大的空间换取循环次数的减少。如果有一百条数据,其中有10条重复数据,则只需要100+(100-10)次循环。
优劣立现。