0

如何在 Ruby 中迭代数组的元素,并且在每一步中,我都可以对包含所有元素的数组做一些事情,除了当前迭代的元素?

例如,[4,2,8]我迭代元素,然后我可以做一些事情

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

4 回答 4

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 - 与 Array 集成

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]
于 2013-02-03T00:51:30.793 回答
0

您可以使用slice 方法并创建一个新数组,其中包含除具有索引的项之外的项。

于 2013-02-03T00:29:56.797 回答
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)}
于 2013-02-03T01:05:46.003 回答
0

它真的看起来像你想要的Array#combination

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

哪个输出:

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

创建的每个子数组都会产生给块,在本例中为ary,因此您可以使用这些值做您想做的事情。

于 2013-02-03T03:23:25.873 回答