在#combination之后获取原始数组索引

时间:2015-06-18 23:26:37

标签: arrays ruby

我正在学习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

1 个答案:

答案 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}