Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 具有多个值的Ruby哈希键:及时返回最小值_Arrays_Ruby_Hash_Nested Loops - Fatal编程技术网

Arrays 具有多个值的Ruby哈希键:及时返回最小值

Arrays 具有多个值的Ruby哈希键:及时返回最小值,arrays,ruby,hash,nested-loops,Arrays,Ruby,Hash,Nested Loops,更新:我最初覆盖哈希键,但后来解决了这个问题。感谢大家迄今为止的投入 现在的问题是迭代需要多长时间来生成数据: 客户csv有22000行 光纤csv有170000行 fiber = CSV.read("fiber.csv", {headers: true}) customers = CSV.read("customers.csv", {headers: true}) hh = Hash.new { |hsh,key| hsh[key] = [] } #for each customer, l

更新:我最初覆盖哈希键,但后来解决了这个问题。感谢大家迄今为止的投入

现在的问题是迭代需要多长时间来生成数据:

客户csv有22000行

光纤csv有170000行

fiber = CSV.read("fiber.csv", {headers: true})
customers = CSV.read("customers.csv", {headers: true})

hh = Hash.new { |hsh,key| hsh[key] = [] }

#for each customer, loop through all the fiber coords
customers.each do |c|
  fiber.each do |f|
    hh[customer["cid"]].push Haversine.distance(c["lat"], c["lng"], f["lat"], f["lng"])
  end
end

vals = hh.map { |k, v| v.min } #returns the minimum value per row (which I want)
因为我想在程序/命令行之外使用这些值,所以我认为编写CSV是一种不错的方法(欢迎其他建议)

但是,由于上面的嵌套循环需要数小时不间断地运行,因此这不是一种理想的方法

CSV.open("hash_output.csv", "wb") {|csv| vals.each {|elem| csv << [elem]} }

CSV.open(“hash|u output.CSV”、“wb”){CSV | vals.each{elem | CSV我认为问题在于您正在用每个循环覆盖您的名称空间。我会这样做:

hh = Hash.new { |hsh,key| hsh[key] = [] }
#for each customer, loop through all the fiber coords
customers.each do |c|      
  fiber.each do |f|
    hh[c["last Name"]].push Haversine.distance(c["lat"], c["lng"], f["lat"], f["lng"])
  end
end
{ 
   "DOE" => [922224.16, 920129.46, 919214.42],
   ...
}
这样,键将是客户的姓氏,值将是一个距离数组。 因此,生成的数据结构如下所示:

hh = Hash.new { |hsh,key| hsh[key] = [] }
#for each customer, loop through all the fiber coords
customers.each do |c|      
  fiber.each do |f|
    hh[c["last Name"]].push Haversine.distance(c["lat"], c["lng"], f["lat"], f["lng"])
  end
end
{ 
   "DOE" => [922224.16, 920129.46, 919214.42],
   ...
}

我认为问题在于每个循环都覆盖了名称空间。我会这样做:

hh = Hash.new { |hsh,key| hsh[key] = [] }
#for each customer, loop through all the fiber coords
customers.each do |c|      
  fiber.each do |f|
    hh[c["last Name"]].push Haversine.distance(c["lat"], c["lng"], f["lat"], f["lng"])
  end
end
{ 
   "DOE" => [922224.16, 920129.46, 919214.42],
   ...
}
这样,键将是客户的姓氏,值将是一个距离数组。 因此,生成的数据结构如下所示:

hh = Hash.new { |hsh,key| hsh[key] = [] }
#for each customer, loop through all the fiber coords
customers.each do |c|      
  fiber.each do |f|
    hh[c["last Name"]].push Haversine.distance(c["lat"], c["lng"], f["lat"], f["lng"])
  end
end
{ 
   "DOE" => [922224.16, 920129.46, 919214.42],
   ...
}

在这里,每次迭代都要覆盖密钥
hh[“customer_name”]=c[“Last name”]
我认为你应该重新考虑你的数据结构……你想要一个散列数组,每个散列都有一个客户名称和英尺到英尺的光纤列表?或者可能是一个散列,其中的键是客户名称,值是英尺到英尺的光纤VAL?我认为是一个散列,键是:键1是客户名称,键2是英尺到英尺的光纤,具有很多值s、 如果使用单个客户名称密钥和单个英尺到光纤密钥进行哈希,则只能存储一个客户的数据。您需要将密钥设置为动态密钥(例如,使用名称作为密钥,如@NateSHolland所示),或使用数组。我同意@max,您需要重新考虑您的数据结构,但我想指出,只要有两个数组,
a
b
,并且对于
a
的每个元素,您希望对
b
的每个元素执行一些操作(如下所示)你应该考虑使用这个方法。举例来说,假设“代码>:a,,b:<代码> b=[ 1, 2 ] < /代码>。然后<代码> C=A.By[O]=> [[:a,2 ],[(b,1)],[(b,2)] < /代码>。然后你可以使用<代码> c>代码>来构造你想要的哈希。在这里,你重写每个迭代的代码<代码> hh [ Cuffer-MyNo])= C[C]。“姓氏”]
我认为你应该重新考虑你的数据结构……你想要一个散列数组,每个散列都有一个客户名称和英尺到英尺的光纤列表?或者可能是一个散列,其中的键是客户名称,值是英尺到英尺的光纤VAL?我认为是一个散列,键是:键1是客户名称,键2是英尺到英尺的光纤,具有很多值s、 如果使用单个客户名称密钥和单个英尺到光纤密钥进行哈希,则只能存储一个客户的数据。您需要将密钥设置为动态密钥(例如,使用名称作为密钥,如@NateSHolland所示),或使用数组。我同意@max,您需要重新考虑您的数据结构,但我想指出,只要有两个数组,
a
b
,并且对于
a
的每个元素,您希望对
b
的每个元素执行一些操作(如下所示)您应该考虑使用该方法。例如,假设“代码> a=::a,,b] < />代码> b>=[1, 2 ] < /代码>。然后<代码> C= A.产品B[*]=[[(a,1),[:A,2 ],[::B,1 ],[:B,2 ] ]。。然后,您可以使用
c
来构造所需的哈希。您好,Nate,您是正确的,在今天早上检查您的答案之前,您能够找出覆盖的内容(谢谢您,顺便说一句)。我现在遇到的问题是,有太多的客户lat-long对(约22k)甚至更多的光纤对(170k).因此,它需要永远运行(昨晚运行了几个小时,看不到尽头)。将更新我的OP。是的,这是一个运行的mxn算法,因此对于这么大的数字,它将非常慢,并且会占用大量内存空间。您还可以将所有客户存储在一个DB中,将所有光纤值存储在一个DB中,然后每次您想知道值时都进行查找和计算。您好,Nate,您是正确的,并且在今天早上检查您的答案之前,我已经找到了覆盖的问题(谢谢,顺便说一句)。我现在遇到的问题是,有太多的客户lat-long对(约22k)和更多的光纤对(170k)。因此运行需要很长时间(昨晚运行了几个小时,看不到尽头)。将更新我的OP。是的,这是一个要运行的mxn算法,因此对于这么大的数字,速度会非常慢,并且会占用大量内存空间。您还可以将所有客户存储在一个DB中,将所有光纤值存储在一个DB中,然后每次想知道值时都进行查找和计算。