迭代数组并在每一步中留出一个

时间:2013-02-03 00:26:34

标签: ruby

如何在Ruby中迭代数组的元素,在每个步骤中,我可以对包含所有元素的数组执行某些操作,但目前迭代的元素除外?

例如对于[4,2,8]我迭代元素然后我可以用

做一些事情
  • [2,8]
  • [4,8]
  • [4,2]

4 个答案:

答案 0 :(得分:1)

这不是直接可能的(除非你不需要缺少的元素)。但你可以自己编程:

选项1 - 只需执行

a = [11,22,33,44,55]

a.each_with_index { |e,i|
  p e
  p a.take(i) + a[i+1..-1]
}

选项2 - 与数组集成

class Array
  def each_excluded(&block)
    self.each_with_index { |e, i|
      yield(e, self.take(i) + self[i+1..-1])
    }
  end
end

a.each_excluded { |e, rest|
  p e
  p rest
}

从任何一个输出:

11
[22, 33, 44, 55]
22
[11, 33, 44, 55]
33
[11, 22, 44, 55]
44
[11, 22, 33, 55]
55
[11, 22, 33, 44]

答案 1 :(得分:0)

您可以使用slice method并创建一个新数组,其中包含索引所在的项目除外。

答案 2 :(得分:0)

[4, 2, 8].tap{|a| a.length.times{|i| 
  do_something_you_want_with(a[0...i]+a[i+1..-1])
}}

class Array
  def each_but_one &pr
    length.times{|i| pr.call(self[0...i]+self[i+1..-1])}
  end
end

[4, 2, 8].each_but_one{|a| do_something_you_want_with(a)}

答案 3 :(得分:0)

看起来你想要Array#combination

[4,2,8].combination(2).each do |ary|
  p ary
end

哪个输出:

[4, 2]
[4, 8]
[2, 8]

创建的每个子数组都会生成块,在本例中为ary,因此您可以使用值执行所需的操作。