Нечетные (или четные) записи в 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 ]

2 голосов
/ 23 октября 2009

Еще один способ думать об этом (добавляет массив2 к массиву1):

array1 << array2.values_at(*Array.new(array2.size/2){|i| i*2})
1 голос
/ 23 октября 2009
a = [0,1,2,3,4,5,6,7,8,9]

(1...a.size).step(2).collect { |i| a[i] }
=> [1, 3, 5, 7, 9]

(2...a.size).step(2).collect { |i| a[i] }
=> [2, 4, 6, 8]

Конечно, учитывая 0, нечетный индекс создает немного хакерства, верно? Так как у вас будут соседние записи, которые в действительности являются странными признаками. Чтобы компенсировать это, вы можете просто добавить нулевую запись к результату первого сбора. Рассмотрим:

[a[0]] + (1...a.size).step(2).collect { |i| a[i] }
=> [0, 1, 3, 5, 7, 9]

Вы всегда можете сжать это дальше и сделать что-то вроде:

a.values_at(*(1...a.size).step(2))
=> [1, 3, 5, 7, 9]

a.values_at(*(2...a.size).step(2))
=> [2, 4, 6, 8]

Тот же хак доступен для обработки нулевой записи.

1 голос
/ 23 октября 2009

Это может сработать для вас, или опять же, не: -)

irb(main):050:0> all = [1,2,3,4,5,6,7,8,9]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
irb(main):051:0> evens = []
=> []
irb(main):052:0> all.each_index do |i| if (i.even?): evens.push(a[i]) end end
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
irb(main):053:0> evens
=> [1, 3, 5, 7, 9]
1 голос
/ 17 октября 2012
a = [1,2,3,4,5]
a.in_groups_of(2).map(&:first) => odds
a.in_groups_of(2).map(&:last) => evens
1 голос
/ 11 марта 2012
evens = (1..10).each_with_object([]) {|i, a| a << i*2 }
#=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
1 голос
/ 23 октября 2009

Вот фрагмент кода , предназначенный для добавления метода select_with_index в Enumerable, который позволит вам сделать

array.select_with_index{|item, i| item if i % 2 == 0} для вечера

array.select_with_index{|item, i| item if i % 2 == 1} для коэффициентов

1 голос
/ 23 октября 2009

Мой взгляд на проблему, определяющий простые расширения Array:

class Array
  def odd_values
    (0...length / 2).collect { |i| self[i*2 + 1] }
  end

  def even_values
    (0...(length + 1) / 2).collect { |i| self[i*2] }
  end
end

puts [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ].odd_values.inspect
# => [1, 3, 5, 7, 9]

puts [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ].even_values.inspect
# => [0, 2, 4, 6, 8]

puts [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ].even_values.inspect
# => [0, 2, 4, 6, 8]

puts [ ].even_values.inspect
# => []
1 голос
/ 23 октября 2009

С пустым массивом A и полным массивом H, что-то вроде этого должно работать:

H.size.times do |i|
  if i % 2 == 1
    A[i/2] = H[i]
  end
end
0 голосов
/ 23 октября 2009
module Enumerable
  def odd_values
    r = []
    self.each_index {|x| r << self[x] if x%2==0}
    r
  end
end

p ["a", "b" ,"c" ,"d" ,"e"].odd_values  #returns ["a","c","e"]
p ["a", "b" ,"c" ,"d" ,"e"].odd_values.join("-") #returns "a-c-e"

Я просто использовал подход, который использовал для другого вопроса о массивах. : D

0 голосов
/ 29 мая 2018

Я предлагаю использовать функцию Enumerable # Inject

array = (1..30)    
array.inject({even: [], odd: []}){|memo, element| memo[element.even? ? :even : :odd] << element; memo}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...