我正在学习Ruby,我在一些实践问题中遇到的一个问题是使用数组的组合,但结果得到原始数组索引而不是实际组合。为了简单起见,我们只谈谈配对。我知道获得所有可能的对的快速方法是:
array = [a, b, c]
array.combination(2).to_a
# => [[a, b], [a, c], [b, c]]
现在让我们说我想迭代这些组合并选择一个符合任意条件的对。返回该对很容易:
...select{|pair| condition}
# => [a, c]
# assuming this pair fits the condition
但是如果我想从原始数组中返回索引呢?
# => [0, 2]
有没有办法使用#combination
执行此操作?或者你是否必须在这种情况下自己找到组合?如果是这样,有一个更优雅的方式来做到这一点(这是我最终做的解决这些问题)?
array.each.with_index do |s1, i1|
array[(i1 + 1)..-1].each.with_index do |s2, i2|
if condition
result = [i1, (i2 + i1 + 1)]
end
end
end
答案 0 :(得分:0)
试试这个:
array = ['a', 'b', 'c', 'd']
array.combination(s).to_a.reduce do |memo, pair|
if condition # I tested with pair[0] == 'a' && pair[1] == 'c'
memo = pair.map {|e| array.index(e)}
else
memo
end
end
我对此的测试产生了:
[0, 2]
修改强>
为避免使用索引调用,只需提前计算索引,然后创建它们的组合,选择符合条件的索引:
(0..array.length).to_a.combination(2).to_a.select {|pair| condition}