ruby:数组中小于给定值的所有元素的索引

ruby:数组中小于给定值的所有元素的索引,ruby,arrays,Ruby,Arrays,我有一个数组 a=[10,20,30,10,3,2,200] 我想找到值小于,比如21的元素的索引。我当然可以在循环中这样做,但我想知道是否有更好的单线性方法。就像我们在R.中所做的那样,使用以下命令: 我正在使用ruby 1.8.5 那就做吧 a = [10,20,30,10,3,2,200] a.size.times.select { |i| a[i] < 21 } # => [0, 1, 3, 4, 5] 使用以下方法进行操作: 我正在使用ruby 1.8.5 那就做吧 a

我有一个数组

a=[10,20,30,10,3,2,200]
我想找到值小于,比如21的元素的索引。我当然可以在循环中这样做,但我想知道是否有更好的单线性方法。就像我们在R.

中所做的那样,使用以下命令:

我正在使用ruby 1.8.5

那就做吧

a = [10,20,30,10,3,2,200]
a.size.times.select { |i| a[i] < 21 }
# => [0, 1, 3, 4, 5]
使用以下方法进行操作:

我正在使用ruby 1.8.5

那就做吧

a = [10,20,30,10,3,2,200]
a.size.times.select { |i| a[i] < 21 }
# => [0, 1, 3, 4, 5]

这应该可以做到,并且是线性的:

a.each_with_index.inject([]) {|indexes, pair| indexes << pair.last if pair.first < 21; indexes}  

这应该可以做到,并且是线性的:

a.each_with_index.inject([]) {|indexes, pair| indexes << pair.last if pair.first < 21; indexes}  

Ruby通常不需要查找索引,为什么要这样做

这在1.8中应该可以正常工作:

[10,20,30,10,3,2,200].each_with_index.select{|x,_|x<21}.map{|_,i|i}

Ruby通常不需要查找索引,为什么要这样做

这在1.8中应该可以正常工作:

[10,20,30,10,3,2,200].each_with_index.select{|x,_|x<21}.map{|_,i|i}

当一个严格的解决方案无法解决问题时,这里有更多的选择:

a = [10,20,30,10,3,2,200]

a.size.times.with_object([]) { |i,b| b << i if a[i] < 21 } # or a.each_index.with...

a.size.times.map { |i| a[i] < 21 ? i : nil }.compact # or a.each_index.with...

a.zip( Array(0...a.size) ).select { |e,_| e < 21 }.map(&:last)

a.reduce([[],0]) { |(b,i),e| [e < 21 ? b << i : b, i + 1] }.first

a.each_with_object([]) {|e,a| a << (e.to_i < 21 ? a.size : nil) }.compact

a.each_with_object([[],[]]) {|e,(g,b)|
  e < 21 ? g << (g.size + b.size) : b << nil }.first

(a.each_with_object([-1]) { |_,b| i = a[b.last+1..-1].index {
  |f| f < 21 }; b << b.last + 1 + i if i })[1..-1]

b = a.dup
a.each_with_object([]) { |e,c| i = b.index(e); c << i if e < 21; b[i] = nil }

b = (a + [nil])
a.each.with_object([]) { |_,c|
  c << (a.size - b.index(nil)) if b.first.to_i < 21; b.rotate! }

a.join(',').gsub(/(\d+)/) { |e| (e.to_i < 21) ? $`.count(',') : nil } \
           .gsub(',,',',').split(',').map(&:to_i)

# All => [0, 1, 3, 4, 5] 

当一个严格的解决方案无法解决问题时,这里有更多的选择:

a = [10,20,30,10,3,2,200]

a.size.times.with_object([]) { |i,b| b << i if a[i] < 21 } # or a.each_index.with...

a.size.times.map { |i| a[i] < 21 ? i : nil }.compact # or a.each_index.with...

a.zip( Array(0...a.size) ).select { |e,_| e < 21 }.map(&:last)

a.reduce([[],0]) { |(b,i),e| [e < 21 ? b << i : b, i + 1] }.first

a.each_with_object([]) {|e,a| a << (e.to_i < 21 ? a.size : nil) }.compact

a.each_with_object([[],[]]) {|e,(g,b)|
  e < 21 ? g << (g.size + b.size) : b << nil }.first

(a.each_with_object([-1]) { |_,b| i = a[b.last+1..-1].index {
  |f| f < 21 }; b << b.last + 1 + i if i })[1..-1]

b = a.dup
a.each_with_object([]) { |e,c| i = b.index(e); c << i if e < 21; b[i] = nil }

b = (a + [nil])
a.each.with_object([]) { |_,c|
  c << (a.size - b.index(nil)) if b.first.to_i < 21; b.rotate! }

a.join(',').gsub(/(\d+)/) { |e| (e.to_i < 21) ? $`.count(',') : nil } \
           .gsub(',,',',').split(',').map(&:to_i)

# All => [0, 1, 3, 4, 5] 

我使用的是ruby 1.8.5,它没有明显的每个索引,上面两个在ruby 1.8中都不适用。5@user1631306什么对您不起作用,您可以发布您的错误,而且很难找到对1.8.5的支持,支持的最新版本是1.9.31.8.5吗?真正地你在哪里找到这个古董版本的?a.size.times.select{e|e<21}LocalJumpError:irb没有给出块:8:in'times'从irb:8从:0我得到的每个提供的解决方案都是相同的错误我使用的是ruby 1.8.5,每个都没有明显的索引,在ruby 1.8中,以上两种都不适用于我。5@user1631306什么对您不起作用,您可以发布您的错误,而且很难找到对1.8.5的支持,支持的最新版本是1.9.31.8.5吗?真正地你在哪里找到这个古董版本的?a.size.times.select{e|e<21}LocalJumpError:irb没有给出块:8:in ` times'从irb:8从:0我得到的每个提供的解决方案都是相同的错误你已经勾选了我的答案,这是一个巨大的惊喜。我把它挂起来只是为了好玩。我很想听听你为什么选择它,因为在现实生活中,你可能不会使用我为手头的问题列出的任何解决方案。它们是非常有见地的解决方案,可以在其他场景中产生一些潜在的想法/解决方案。而且,他们为我工作:-你已经勾选了我的答案,这是一个很大的惊喜。我把它挂起来只是为了好玩。我很想听听你为什么选择它,因为在现实生活中,你可能不会使用我为手头的问题列出的任何解决方案。它们是非常有见地的解决方案,可以在其他场景中产生一些潜在的想法/解决方案。而且,他们为我工作:-