使用首选默认值展开数组

Posted

技术标签:

【中文标题】使用首选默认值展开数组【英文标题】:Expand array with preferred default 【发布时间】:2012-12-20 16:52:51 【问题描述】:

Array#[]= 的文档指出

如果索引大于数组的当前容量,则 数组自动增长。

当它自动增长时,它会使用nil 值:

arr = []
arr[2] = "!"
arr # => [nil, nil, "!"]

是否可以指定前两个值的默认值?

目前,我正在做

arr = []
index = 2
currently_uninitialized_value_range = (arr.length)...(index)
default_values = currently_uninitialized_value_range.map "" 
arr[currently_uninitialized_value_range] = default_values
arr[index] = "!"
arr # => ["", "", "!"]

这有点冗长。

我使用的是数组,而不是哈希,因为它们代表我将要输入到电子表格中的值,而我正在使用的库 (Axlsx) 更喜欢按行添加数据行。

【问题讨论】:

arr = Array.new(2, '') # => ["", ""]; arr[2] = "!"; arr => ["", "", "!"]。至少如果您只想初始化前 n 个元素。 @BernardK Array.new(2), '' Array.new(2, '') 更安全。请参阅 rdoc 中 Array.new 的“常见问题”。 【参考方案1】:

Array#fill 可能是你的票。

arr = []

index = 2
arr.fill( "", arr.length...index )
arr[index] = "!"
# => ["", "", "!"]

index = 5
arr.fill( "", arr.length...index )
arr[index] = "!"
# => ["", "", "!", "", "", "!"]

index = 1
arr.fill( "", arr.length...index )
arr[index] = "!"
#=> ["", "!", "!", "", "", "!"]

【讨论】:

【参考方案2】:

使用散列作为数组怎么样?它可能看起来像这样:

h = Hash.new do |hash,key|
  0.upto(key)  |i| hash[i] = "" unless hash.has_key?(i) 
end

h[5]
h[0] #=> ""
h[4] #=> ""
h.keys #=> [0, 1, 2, 3, 4, 5]

也许这种方法需要一些额外的调整来满足您的需求,例如您可以定义方法size 等等。

附:获取数组

h.values #=> ["", "", "", "", "", ""]

【讨论】:

如何将值从这个散列传递到需要值数组的库方法? 如何定义方法 to_a 将带来所需的格式?【参考方案3】:

我快速浏览了Array 文档,但没有发现任何有用的信息...

...但如果我理解得很好,您需要先将 nil 值替换为空字符串 (""),然后才能将数据导出到电子表格。在此之前对数组的每个元素调用to_s 怎么样?:

arr.map! &:to_s

【讨论】:

以上是关于使用首选默认值展开数组的主要内容,如果未能解决你的问题,请参考以下文章

使用协议首选值影响选路

方法参数数组默认值

使用 swift 将数组保存和检索到用户默认值

在C#中使用默认值初始化字符串数组的3种方式

使用数组键和默认值填充哈希

数组动态初始化时,数组元素会被赋予一个默认值,简述各数据类型的初始值?