从数组中选择奇数或偶数元素

时间:2015-12-15 15:03:42

标签: arrays ruby

我被要求编写一段代码,当第二个参数为true时返回数组的奇数元素,如果是false则返回偶数元素。到目前为止,我写了一半,我需要一个可以选择奇数元素的方法。

def odds_and_evens(string, return_odds)
  if return_odds != false
    string.chars.to_a
  end
end

puts odds_and_evens("abcdefgh", true)

7 个答案:

答案 0 :(得分:10)

如果添加此代码,则有两种方便的方法可以从数组中选择奇数或偶数值

class Array
  def odd_values
    values_at(* each_index.select(&:odd?))
  end
  def even_values
    values_at(* each_index.select(&:even?))
  end
end

答案 1 :(得分:3)

class Array
  def odd_values
    e = [false, true].cycle
    select { e.next }
  end
  def even_values
    e = [true, false].cycle 
    select { e.next }
  end
end

arr = "Here is a simple illustration of these methods".split

arr.odd_values
  #=> ["is", "simple", "of", "methods"]
arr.even_values
  #=> ["Here", "a", "illustration", "these"]

答案 2 :(得分:1)

使用Range#step

def odds_and_evens(string, return_odds)
  start = return_odds ? 1: 0
  (start...string.size).step(2).map { |i| string[i] }
  # OR  string.chars.values_at(*(start...string.size).step(2))
end

odds_and_evens("abcdefgh", true) # => ["b", "d", "f", "h"]
odds_and_evens("abcdefgh", false) # => ["a", "c", "e", "g"]

答案 3 :(得分:1)

def odds_and_evens(string, return_odds)
  string.chars.select.with_index{|_, i| return_odds ? i.odd? : i.even?}
end

odds_and_evens("abcdefgh", true)  # => ["b", "d", "f", "h"]
odds_and_evens("abcdefgh", false) # => ["a", "c", "e", "g"]

答案 4 :(得分:1)

这里有一些很好的答案可以找到偶数和奇数字符,但是如果你需要灵活地找到其他类型的数字,你最终可能会改写一些更“粗糙”的东西,如:

{{1}}

答案 5 :(得分:0)

以下是另一种方法:

def odds_and_evens(string, return_odds)
  string.chars.each_slice(2).collect {|pair| return_odds ? pair.last : pair.first }
end

p odds_and_evens("abcdefgh", false)
#=> ["a", "c", "e", "g"]
p odds_and_evens("abcdefgh", true)
#=> ["b", "d", "f", "h"]

另一种变体可以是:

def odds_and_evens(string, return_odds)
  indices = (0...string.size).select {|i| return_odds ? i.odd? : i.even? }
  string.chars.values_at(*indices)
end

答案 6 :(得分:0)

接受的答案还可以,但速度很慢。

这快2-3倍。此外,它不会修补Array类,因此可以在其他对象上使用,例如,ActiveRecod :: Relation

def self.even_elements(list)
    list.values_at(*0.step(list.size - 1, 2))
end

def self.odd_elements(list)
    list.values_at(*1.step(list.size - 1, 2))
end