红宝石循环问题

时间:2011-01-15 06:57:52

标签: ruby-on-rails ruby loops each

我想对一个可以在循环内部改变的变量进行循环。

first_var.sort.each do |first_id, first_value|
  second_var.sort.each do |second_id, second_value_value|
    difference = first_value - second_value
    if difference >= 0
      second_var.delete(second_id)
    else
      second_var[second_id] += first_value
      if second_var[second_id] == 0
        second_var.delete(second_id)
      end
      first_var.delete(first_id)
    end
  end
end

这段代码背后的想法是我想用它来计算某个用户将给其他用户多少钱。这两个变量都包含哈希值。 first_var包含将获得资金的用户,second_var包含将要支付的用户。该循环应该“填满”应该获得金钱的用户,并且当用户满员或者用户没钱时,将其从循环中取出,并继续填满其余用户。

我该怎么做,因为这不起作用?

3 个答案:

答案 0 :(得分:3)

好。你看起来像是两个哈希,因此“id,value”分裂。

如果要循环遍历数组并且想要使用数组的索引,则需要使用Array.each_index。

如果循环遍历一个对象数组,'id'和'value'是属性,你只需要调用一些任意的块变量,而不是两个。

让我们假设它们是两个具有相同长度的H1和H2,具有公共键。您想要执行以下操作:如果H1 [key]值是>比H2 [key]:value,从H2中移除键,否则,加上H1:值到H2:value并将结果放入H2 [key]。

H1.each_key do |k|
  if H1[k] > H2[k] then
     H2.delete(k)
  else 
     H2[k] = H2[k]+H1[k]
  end
end

假设您循环遍历两个数组,并且希望按值对它们进行排序,然后如果A1 [x]中的值大于A2 [x]中的值,则删除A2 [x]。否则,将A1 [x]与A2 [x]相加。

   b = a2.sort
   a1.sort.each_index do |k|
      if a1[k] > b[k]
        b[k] = nil
      else
        b[k] = a1[k] + b[k]
      end
    end
    a2 = b.compact

根据新信息:您有收款人的哈希值和付款人的哈希值。让我们称呼eesers只是为了方便。这很困难的部分是,当你修改ers哈希时,你可能会混淆循环。实现这一目标的一种方法 - 很差 - 如下。

e_keys = ees.keys
r_keys = ers.keys
e = 0
r = 0
until e == e_keys.length or r == r_keys.length
    ees[e_keys[e]] = ees[e_keys[e]] + ers[r_keys[r]]
    x = max_value - ees[e_keys[e]]
    ers[r_keys[r]] = x >= 0 ? 0 : x.abs 
    ees[e_keys[e]] = [ees[e_keys[e]], max_value].min
    if ers[r_keys[r]] == 0 then r+= 1 end
    if ees[e_keys[e]] == max_value then e+=1 end
end

我说这不是一个很好的解决方案的原因是我认为有一种更“红宝石”的方法来做到这一点,但我不确定它是什么。但这确实避免了修改您正在迭代的哈希可能导致的任何问题。

答案 1 :(得分:1)

你的意思是?

some_value = 5
arrarr = [[],[1,2,5],[5,3],[2,5,7],[5,6,2,5]]
arrarr.each do |a|
  a.delete(some_value)
end

arrarr现在的值[[],[1,2],[3],[2,7],[6,2]]


我认为你可以在这样的循环中改变一个变量,但我强烈建议你反对它。我猜它是未定义的行为。 这是我尝试时发生的事情

a.each do |x| 
  p x
  a = []
end

打印 1 2 3 4 五 最后是a [] 而

a.each do |x| 
  p x
  a = []
end

什么都不打印 和a是[]在最后

如果可以,我可以尝试使用 每个/图/滤波器/ select.ect。否则创建一个新数组并正常循环列表。 或者从x到y循环数字

1.upto(5).each do | n |   do_stuff_with(ARR [N]) 端

答案 2 :(得分:-1)

假设:

some_var = [1,2,3,4]

delete_if听起来像是一个可行的候选人:

some_var.delete_if { |a| a == 1 }
p some_var
=> [2,3,4]