push ruby数组中特定索引处的元素

v7pvogib  于 11个月前  发布在  Ruby
关注(0)|答案(3)|浏览(111)

我有一个从数据库返回的数组,我想确保它们总是相同的长度。当它们不是的时候,我想把零推到合适的长度,但也要保持索引的完整性。
大多数时候,它看起来像

array = [["apple", "blueberries", "banana", "kiwi"], ["20.15", "13.50", "22.10", "10.50"], ["10", "12", "26", "34"]]

字符串
我最终会调用each_with_index,并需要它们在一个表中匹配ie.apple,20.15,10。
有时,数组中可能会缺少一两个元素,我想把零放在它们的位置上。

array2 = [["apple", "blueberries", "banana", "kiwi"], ["20.15", "22.10"], ["10", "12", "26", "34"]]


我试过类似的方法

array2.each {|f| f.push(0) until f.length === 4}
=>[["apple", "blueberries", "banana", "kiwi"], ["20.15", "13.50", 0, 0], ["10", "12", "26", "34"]]


但是零将被推到数组的末尾-理想情况下,输出将是

=>[["apple", "blueberries", "banana", "kiwi"], ["20.15", 0, "13.50", 0], ["10", "12", "26", "34"]]

vsaztqbk

vsaztqbk1#

我不想打断你,但编程对孩子来说并不是一件容易的事情,就像非程序员的成年人有时想象的那样。你的情况需要创建一个单独的类,也许是Array的子类。像这样:

class GreenGrocer < Array
end

字符串
现在,我们可以想象重新定义GreenGrocer.new公共类方法,以确保每个GreenGrocer示例都有缺失的元素,并使用零修补,如下所示:

class GreenGrocer # reopening the class we defined earlier
  class << self
    def new array
      produce, float_array, int_array = array.reduce( &:zip ).map( &:flatten ).transpose
      super [ produce, float_array.map { |e| e or 0.0 }, int_array.map { |e| e or 0 } ]
    end

    def [] *elements; new elements end
  end
end

# so we can call

g = GreenGrocer.new( array2 )

# or

g = GreenGrocer[ *array2 ]


但何必呢?这足以使一个#to_table方法将您不完整的数据结构转换为您需要的表,在此过程中将缺失的数据点填充为零。因此,我们定义:

class LazierGreenGrocer < Array
  def to_table
    reduce( &:zip ).map( &:flatten ).map { |e| e.map { |e| e || 0 } }
  end
end

lazier_g = LazierGreenGrocer.new( array2 ) # not eager to do work upon initialization
lazier_g.to_table # does the required work as #to_table is called


这就是我的方法,因为我不知道你想输出什么样的表,你可能需要相应地修改我的#to_table方法。

3zwtqj6y

3zwtqj6y2#

在这里做一些假设:
1.你不在乎它们是否匹配(根据你的示例输出)。

  1. array2的大小始终为4。
  2. array2只会丢失1个或2个元素。
array3 = case array2.size
    when 4
      array2
    when 3
      array2 + [0]
    when 2
      array2.zip([0, 0]).flatten
    else
      raise "problem"
    end

字符串

6ie5vjzr

6ie5vjzr3#

您要使用Array#insert

>> a = [1, 2, 3]
=> [1, 2, 3]
>> a.insert(1, "i am new")
=> [1, "i am new", 2, 3]

字符串

相关问题