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

Arrays 从数组中选择奇数或偶数元素,arrays,ruby,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) 如果添加此代码,则有两种简便的方法可以从数组中选择奇数或偶数值

我被要求编写一段代码,当第二个参数为
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)

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

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


关于查找偶数和奇数字符,这里有一些非常好的答案,但是如果您需要灵活地查找其他类型的数字,您可能会使用更“粗糙”的内容进行重写,例如:

def odds_and_evens(string, return_odds)
  new_string = string.chars.to_a
  even_odd_string = []

  new_string.each_with_index do |letter, index|
    if return_odds != true && index %2 == 0
      even_odd_string << letter
    elsif return_odds != false && index %2 == 1
      even_odd_string << letter
    end
  end
  even_odd_string
end

puts odds_and_evens("abcdefgh", true)
def赔率和偶数(字符串、返回赔率)
新建字符串=string.chars.to\u a
偶数\奇数\字符串=[]
新建_字符串。每个_带有_索引do |字母,索引|
如果返回_赔率!=true&索引%2==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

被接受的答案是可以的,但速度很慢

这要快2-3倍。此外,它不会对数组类进行猴补丁,因此它可以用于其他对象,例如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

你的“一半”甚至不起作用<代码>=而不是
=。哈哈,男生出错了!现在排序:)你在说什么数组?您似乎正在传递一个字符串到方法中。如果任何一个答案都是有用的,请考虑选择一个。好代码。code>.select{i | i.odd?}
.select{i | i.偶?}
可以缩短为
。select(&:odd?
。select(&:偶?
自我。
可以省略。非常好!我喜欢的一点是,它读起来非常好。
odd\u case
的一个变体是用
*(1…size)替换
参数处的
值。步骤(2)。到A
(并将
偶数情况下的
1
更改为
0
),ala@falsetru的答案。我已经放弃了这个参数可以是一个范围,所以你可以在我的评论中把
放到A
。索引0,2,4.是偶数,不是奇数。但我不确定OP是指以0为基础还是以1为基础的计数。@sawa,谢谢你指出这一点。我相应地更新了答案。(与最古老的答案相匹配)是的,@Wand,我一般喜欢枚举数,尤其是
cycle
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
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"]
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