ruby比较字符串(带符号)以找到最接近的整数匹配

时间:2015-03-27 22:18:25

标签: ruby

我有一个数组,其格式为timestamp(由冒号分隔),lat,lng。我还有另一组时间戳。我试图比较数组并找到最接近的匹配,然后返回相应的lat和lng。

timestampArr=["3,18,9,24,34","2,27,7,22,49"]
gpsArr=["3:15:9:24:36,33.6789,78.8908","3:17:9:2:34,33.7,88.9"]
#output expected: ["33.7,88.9","33.6789,78.8908"]
#first timestamp in timestampArr matches 2nd timestamp in gpsArr so return that lat,lng

我的代码:

def closest_float(xs, value)
  xs.min_by { |x| (x.to_f - value).abs }
end

    def getGPSforTime(timeArr.gpsFilepath)
     text=text.each_slice(7).to_a #5 for timestamp(sep ,) +lat+lng
        gpsTimes=Array.new
        finalArr=Array.new
        text.each{|x|
            timeSinceEpoch=Time.new('2014',x[0].to_i,x[1].to_i,x[2].to_i,x[3].to_i,x[4].to_i,"+09:00")
            timeSinceEpoch=timeSinceEpoch.to_i
            gpsTimes.push("#{timeSinceEpoch}")#ts(sep :)
        }
    timeArr.each{|x|
        x=x.split(",")
        timeSinceEpoch=Time.new('2014',x[0].to_i,x[1].to_i,x[2].to_i,x[3].to_i,x[4].to_i,"+09:00")
        timeSinceEpoch=timeSinceEpoch.to_i
        gpsClosestTime=closest_float(gpsTimes, timeSinceEpoch)
        finalArr.push(text[gpsTimes.index(gpsClosestTime)][5],text[gpsTimes.index(gpsClosestTime)][6])
    }
return finalArr
end

到目前为止,我的代码完全搞砸了(不工作)。有人可以提供一个比我尝试做的更简单的解决方案吗?

时间戳格式为:month:day:hour:minute:second。

1 个答案:

答案 0 :(得分:0)

我必须对我的代码进行一些修改才能使它工作,主要是我获得子串的问题。这是我最终的解决方案:

def closest_int(xs, value)
 return xs.min_by { |x| 
  (x.to_i - value.to_i).abs 
  }
end

def getGPSforTime(timeArr,gpsFilePath)
    text=File.open(gpsFilePath).read 
    text=text.gsub ':',',' #to account for newer versions with colon
    text=text.split(',')
    text=text.each_slice(7).to_a #5 for timestamp(sep ,) +lat+lng
    gpsTimes=Array.new
    gps=Array.new
    finalArr=Array.new
    text.each{|x|
        gpsTimes.push("#{x[0]}#{x[1]}#{x[2]}#{x[3]}#{x[4]}")#ts(sep :)
        gps.push("#{x[5]},#{x[6]}")
    }
timeArr.each{|x|
    x=x.split(":")
    time="#{x[0]}#{x[1]}#{x[2]}#{x[3]}#{x[4]}"
    gpsClosestTime=closest_int(gpsTimes, time)
    puts "#{time} closest to: #{gpsClosestTime}"
    finalArr.push("#{text[gpsTimes.index(gpsClosestTime)][5]},#{text[gpsTimes.index(gpsClosestTime)][6]}")
}

return finalArr
end