Ruby数组中的奇数(或偶数)条目

有没有一种快速的方法来获取Ruby中的每个其他项目? 包含在奇数中的奇数或偶数值为0。 我想能够像这样使用它:

array1 += array2.odd_values 

要么

 puts array2.odd_values.join("-") 

例如

更新

这给了我后,但我确定有一个更短的版本。

 array1.each_with_index do |item,index| if (index %2 ==0) then array2.push(item) end end 
 a = ('a'..'z').to_a a.values_at(* a.each_index.select {|i| i.even?}) # => ["a", "c", "e", "g", "i", "k", "m", "o", "q", "s", "u", "w", "y"] a.values_at(* a.each_index.select {|i| i.odd?}) # => ["b", "d", "f", "h", "j", "l", "n", "p", "r", "t", "v", "x", "z"] 

所以,按要求

 class Array def odd_values self.values_at(* self.each_index.select {|i| i.odd?}) end def even_values self.values_at(* self.each_index.select {|i| i.even?}) end end 

 arr = ["0", "1", "2", "3"] arr.select.each_with_index { |_, i| i.odd? } arr.select.each_with_index { |_, i| i.even? } 

正如floum所指出的,在Ruby 2.2中,你可以简单地做:

 arr.select.with_index { |_, i| i.odd? } 

你可以使用这个:

 (1..6).partition { |v| v.even? } #=> [[2, 4, 6], [1, 3, 5]] 

从Ruby文档: Ruby文档参考

 left,right = a.partition.each_with_index{ |el, i| i.even? } 

一些疯狂的方式使用方面:

 require 'facets' array = [1,2,3,4,5] odd = array.to_h.keys # 1,3,5 even = array.to_h.values.compact # 2,4 

这可能永远不会被阅读,但…

简单而干净:

 array2.map{ |n| n if n % 2 == 0 }.compact # evens array2.map{ |n| n if n % 2 == 1 }.compact # odds 

只是find了一个更简洁的方式(得爱Ruby):

 array2.find_all{ |n| n % 2 == 0 } # evens array2.reject { |n| n % 2 == 0 } # odds 
 dst = [] array.each_slice(2) { |x| dst.push(x[1]) } 

应该给你一个奇数指数arrays。

x[1]replace为偶数条目的x[0]

作为logging:

 a = [1,2,3,4,5,6] h = Hash[*a] evens = h.keys odds = h.values 

我使用Array的“splat”操作符来获取逗号分隔值,并将其传递给Hash,Hash接受参数作为交替键/值。

 odds = array.each_slice(2).map(&:first) evens = array.each_slice(2).map(&:last) 

另一种考虑它的方法(将array2增加到array1):

 array1 << array2.values_at(*Array.new(array2.size/2){|i| i*2}) 

这似乎是最Rubyish的解决scheme,结合JacobM和格兰杰克曼的方法最好的。

 module ::Enumerable def select_with_index index = -1 select { |x| yield(x, (index += 1)) } end def odds select_with_index {|x,i| i.odd?} end def evens select_with_index {|x,i| i.even?} end end 

这是一个代码片段 ,旨在将一个select_with_index方法添加到Enumerable,这将允许您执行

array.select_with_index{|item, i| item if i % 2 == 0} array.select_with_index{|item, i| item if i % 2 == 0} for evens

array.select_with_index{|item, i| item if i % 2 == 1} array.select_with_index{|item, i| item if i % 2 == 1}赔率

我遇到这个问题,定义简单的数组扩展:

 class Array def odd_values (0...length / 2).collect { |i| self[i*2 + 1] } end def even_values (0...(length + 1) / 2).collect { |i| self[i*2] } end end puts [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ].odd_values.inspect # => [1, 3, 5, 7, 9] puts [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ].even_values.inspect # => [0, 2, 4, 6, 8] puts [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ].even_values.inspect # => [0, 2, 4, 6, 8] puts [ ].even_values.inspect # => [] 

这可能适用于你,或者再次,不:-)

 irb(main):050:0> all = [1,2,3,4,5,6,7,8,9] => [1, 2, 3, 4, 5, 6, 7, 8, 9] irb(main):051:0> evens = [] => [] irb(main):052:0> all.each_index do |i| if (i.even?): evens.push(a[i]) end end => [1, 2, 3, 4, 5, 6, 7, 8, 9] irb(main):053:0> evens => [1, 3, 5, 7, 9] 
 a = [0,1,2,3,4,5,6,7,8,9] (1...a.size).step(2).collect { |i| a[i] } => [1, 3, 5, 7, 9] (2...a.size).step(2).collect { |i| a[i] } => [2, 4, 6, 8] 

当然,考虑到一个奇数索引会造成一点小小的嘲笑,对吧? 因为你将有相邻的条目有效的奇怪的痕迹。 为了弥补这一点,你可以将第零个条目添加到第一个收集的结果。 考虑:

 [a[0]] + (1...a.size).step(2).collect { |i| a[i] } => [0, 1, 3, 5, 7, 9] 

你总是可以进一步压缩,做一些事情:

 a.values_at(*(1...a.size).step(2)) => [1, 3, 5, 7, 9] a.values_at(*(2...a.size).step(2)) => [2, 4, 6, 8] 

同样的黑客可以处理第零个条目。

 evens = (1..10).each_with_object([]) {|i, a| a << i*2 } #=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 
 a = [1,2,3,4,5] a.in_groups_of(2).map(&:first) => odds a.in_groups_of(2).map(&:last) => evens 

用一个空数组A和一个完整的数组H ,像这样的东西应该工作:

 H.size.times do |i| if i % 2 == 1 A[i/2] = H[i] end end 
 module Enumerable def odd_values r = [] self.each_index {|x| r << self[x] if x%2==0} r end end p ["a", "b" ,"c" ,"d" ,"e"].odd_values #returns ["a","c","e"] p ["a", "b" ,"c" ,"d" ,"e"].odd_values.join("-") #returns "ace" 

我只是重复使用了一个方法,用于数组上的另一个问题。 :d

不要忘记好朋友Array.inject

 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] a.inject([]){|result, item| result << item if item %2 == 1; result} 

应该给你一些奇怪的物品。