Нечетные (или четные) записи в Ruby Array - PullRequest
52 голосов
/ 23 октября 2009

Есть ли быстрый способ получить любую другую запись в массиве в 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

Ответы [ 21 ]

82 голосов
/ 23 октября 2009
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
66 голосов
/ 22 ноября 2012

...

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? }
19 голосов
/ 23 августа 2014

Вы можете просто использовать это:

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

Из документов Ruby: Справочник по документам Ruby

15 голосов
/ 14 августа 2013
left,right = a.partition.each_with_index{ |el, i| i.even? }
9 голосов
/ 19 сентября 2011

Какой-то безумный способ использования граней:

require 'facets'
array = [1,2,3,4,5]
odd = array.to_h.keys # 1,3,5
even = array.to_h.values.compact # 2,4
8 голосов
/ 06 февраля 2014

Это, вероятно, никогда не будет прочитано, но ...

Просто и чисто:

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

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

Только что нашел более краткий способ (должен любить Руби):

array2.find_all{ |n| n % 2 == 0 } # evens

array2.reject  { |n| n % 2 == 0 } # odds
5 голосов
/ 23 октября 2009
dst = []
array.each_slice(2) { |x| dst.push(x[1]) }

должен дать вам массив нечетных индексов.

Заменить x[1] на x[0] для четных записей.

4 голосов
/ 19 февраля 2013

Для записи:

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

Я использую оператор «splat» в массиве Array, чтобы получить значения, разделенные запятыми, и передать их в Hash, который принимает аргументы в качестве переменных ключей / значений.

4 голосов
/ 15 января 2013
odds = array.each_slice(2).map(&:first)
evens = array.each_slice(2).map(&:last)
2 голосов
/ 25 августа 2012

Это кажется самым рубиновым решением, сочетающим в себе лучшие из подходов JacobM и glenn jackman.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...