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