首页 > 解决方案 > ruby 方法返回带有奇数/偶数索引的错误元素 ruby​​ 2.6.0

问题描述

def even_odd_array
  number = 5169294814153321
  array_odd_index = []
  array_even_index = []

  array_of_chars = number.to_s.chars.map(&:to_i)
  array_of_chars.each { |x| array_of_chars.index(x) % 2 == 0 ? array_even_index << x : array_odd_index << x } <----- this returns wrong arrays
  #array_odd_index, array_even_index = array_of_chars.each_slice(2).to_a.transpose
  p array_even_index
  p array_odd_index  
end

array_even_index [5, 6, 2, 4, 4, 5, 3, 3, 2]

array_odd_index [1, 9, 9, 8, 1, 1, 1]

它有什么问题,还有其他方法可以做到吗?

标签: ruby

解决方案


您的实际代码的问题在于它index返回它在接收器中找到的第一个元素的索引。由于 1 是 4 次,number它将number从左到右返回第一个 1 的索引,对于所有其他重复数字相同。

一个简单的解决方案;使用each_with_index它允许您遍历接收器中的每个元素并生成该元素的当前索引,因此您可以检查索引是否为偶数,决定将元素推送到何处:

array_of_chars.each_with_index do |x, index|
  if index.even?
    array_even_index << x
  else
    array_odd_index << x
  end
end

或者您可以为此使用partitionplus with_index

array_even_index, array_odd_index = 5169294814153321.digits.reverse.partition.with_index { |_, index| index.even? }
p array_even_index # [5, 6, 2, 4, 1, 1, 3, 2]
p array_odd_index # [1, 9, 9, 8, 4, 5, 3, 1]

推荐阅读