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