我只是想在大小為 4 的陣列中獲得所有 2、3 和 4 組合(例如 1&2,1&3,1&4,2&3 等),我遇到了這個我無法弄清楚的奇怪問題。為什么primary_num 在第三個回圈中回傳4,但索引0 的值是3,它不應該回傳3。
代碼是部分代碼,但在我弄清楚這部分之前顯然無法完成它。我的下一個計劃是嘗試一個遞回函式,但很好奇為什么當它在回圈 1 和 2 上作業正常時會發生這種情況。我知道有一種排列方法,但我只是在試驗。
lucky15 = [1,2,3,4]
doubles = []
triples = []
fourfold = []
lucky15.each_with_index do |primary_num, index|
lucky15.delete(index)
p lucky15[0]
p primary_num
p lucky15
end
看跌期權的輸出是:
1 #p lucky15[0]
1 #p primary_num
[1, 2, 3, 4]
2 #p lucky15[0]
2 #p primary_num
[2, 3, 4]
3 #p lucky15[0]
4 #p primary_num <--- why 4 not 3????
[3, 4]
解釋我在第一次修訂時嘗試做的事情:
lucky15 = [1,2,3,4]
doubles = []
triples = []
fourfold = []
lucky15.each_with_index do |primary_num, index|
lucky15.delete(index)
each.lucky15 do |num|
doubles << "#{primary_num} && #{num}"
end
end
puts doubles
uj5u.com熱心網友回復:
試圖獲得所有 2、3 和 4 個組合
要手動計算組合,您通常使用嵌套回圈。對于“雙打”,您可以使用:
lucky15 = [1, 2, 3, 4]
doubles = []
(0...lucky15.size-1).each do |i|
(i 1...lucky15.size).each do |j|
doubles << lucky15.values_at(i, j)
end
end
doubles #=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
外回圈i從0to增加一個索引2(因為2是“2 組合”的最大起始索引)。然后內部回圈將另一個索引j從i的后繼增加到3(陣列的結束索引)。這樣,內部回圈會“跳過”已經被 : 訪問過的索引i(因此無需洗掉任何內容)
1 2 3 4 # array values
0 1 2 3 # array indices
i j # lucky15.values_at(0, 1)
1 2 3 4
0 1 2 3
i j # lucky15.values_at(0, 2)
1 2 3 4
0 1 2 3
i j # lucky15.values_at(0, 3)
1 2 3 4
0 1 2 3
i j # lucky15.values_at(1, 2)
1 2 3 4
0 1 2 3
i j # lucky15.values_at(1, 3)
1 2 3 4
0 1 2 3
i j # lucky15.values_at(2, 3)
要獲得“三元組”,您需要另一個級別:
triples = []
(0...lucky15.size-2).each do |i|
(i 1...lucky15.size-1).each do |j|
(j 1...lucky15.size).each do |k|
triples << lucky15.values_at(i, j, k)
end
end
end
triples #=> [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
可視化:
1 2 3 4
0 1 2 3
i j k
1 2 3 4
0 1 2 3
i j k
1 2 3 4
0 1 2 3
i j k
1 2 3 4
0 1 2 3
i j k
但是,Ruby 已經內置了上述方法,combination因此無需重新發明輪子:
doubles = lucky15.combination(2).to_a
#=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
triples = lucky15.combination(3).to_a
#=> [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
uj5u.com熱心網友回復:
看起來該delete方法沒有按照您的想法執行(此處相同,我必須運行此修改版本并進行更多列印才能看到它):
lucky15 = [1,2,3,4]
doubles = []
triples = []
fourfold = []
lucky15.each_with_index do |primary_num, index|
puts "Index: #{index}"
puts "0th element before delete: #{lucky15[0]}"
lucky15.delete(index)
puts "0th element after delete: #{lucky15[0]}"
puts "primary_num: #{primary_num}"
puts "lucky15: #{lucky15}"
end
輸出:
Index: 0
0th element before delete: 1
0th element after delete: 1
primary_num: 1
lucky15: [1, 2, 3, 4]
Index: 1
0th element before delete: 1
0th element after delete: 2
primary_num: 2
lucky15: [2, 3, 4]
Index: 2
0th element before delete: 2
0th element after delete: 3
primary_num: 4
lucky15: [3, 4]
該index變數每次都保存索引,但delete正在搜索陣列中的元素并在它存在時將其洗掉。因此,當您使用delete這種方式時,您將在每次迭代期間從陣列中洗掉與索引相等的元素,如果該元素在該迭代期間存在于陣列中。
您可能想要delete_at(https://ruby-doc.org/core-3.0.0/Array.html#method-i-delete_at)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389767.html
標籤:红宝石
上一篇:Ruby動態更新嵌套陣列中的值
