我想对一个可以在循环内部改变的变量进行循环。
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包含将要支付的用户。该循环应该“填满”应该获得金钱的用户,并且当用户满员或者用户没钱时,将其从循环中取出,并继续填满其余用户。
我该怎么做,因为这不起作用?
答案 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
根据新信息:您有收款人的哈希值和付款人的哈希值。让我们称呼ees
和ers
只是为了方便。这很困难的部分是,当你修改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]