10.make_array #=> [0,1,2,3,4,5,6,7,8,9,10]
如果n为负数,它也应该有效:
-10.make_array #=> [0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
我已经编写了这段代码,但我认为我使它变得比必要的更复杂(它对负数不起作用):
class Fixnum define_method(:make_array) do my_array = [] self.times() do |count| self.>(0) my_array.push(count) end my_array.push(self) my_array endend
有没有更简单的方法或捷径做同样的事情,以及如何处理负数的任何建议?
解决方法 要支持负数,您可以使用upto
和 downto
以及条件: (我在这里展示了一个独立的方法,而不是修补整数)
def make_array(n) if n > 0 0.upto(n).to_a else 0.downto(n).to_a endend
上面创建了一个使用Enumerable#to_a
转换为数组的枚举器.
您可能希望通过直接调用Array::new
跳过中间对象(枚举器) – 它创建一个具有给定数量元素的数组:
n = 3Array.new(n) #=> [nil,nil,nil]
如果给出了一个块,它会将每个元素的索引传递给块,我们应该返回它的值.该索引实际上正是我们想要的,所以我们可以简单地返回它:
Array.new(n) { |i| i } #=> [0,2]
如您所见,Array.new(n)返回n个元素,但我们需要n 1,所以让我们解决这个问题:
Array.new(n + 1) { |i| i } #=> [0,3]
不幸的是,Array :: new不接受负面大小:
Array.new(-3) #=> negative array size (ArgumentError)
所以对于负数n,我们必须传递-n并返回-i:
n = -3Array.new(-n + 1) { |i| -i } #=> [0,-3]
作为一种方法:
def make_array(n) if n > 0 Array.new(n + 1) { |i| i } else Array.new(-n + 1) { |i| -i } endend
我们试着避免重复.
使用abs
可以很容易地将n转换为正数:
3.abs #=> 3-3.abs #=> 3
适用于我们的代码:
n = 3Array.new(n.abs + 1) { |i| i } #=> [0,3]n = -3Array.new(n.abs + 1) { |i| i } #=> [0,3]
对于块,我们可以使用ternary if
:
n = 3Array.new(n.abs + 1) { |i| n > 0 ? i : -i } #=> [0,3]n = -3Array.new(n.abs + 1) { |i| n > 0 ? i : -i } #=> [0,-3]
我们甚至可以通过使用宇宙飞船 *** 作符a< =>来删除该条件.湾它通过分别返回-1,0或1来确定a是否小于,等于或大于b.
更具体地,对于Fixnum#<=>
,n = 0.如果n大于0,则返回0;如果n小于0,则返回-1:
3 <=> 0 #=> 1-3 <=> 0 #=> -1
我们可以在块中使用< =>的结果来将i乘以:
Array.new(n.abs + 1) { |i| i * (n <=> 0) }
这相当于i * 1(如果n> 0)或i * -1(如果n <0). (有第三个返回值:如果n等于0,则n< => 0返回0,但这无关紧要,因为在这种情况下,结果数组为[0],0 * 0仍然为0)
作为一种方法:
def make_array(n) Array.new(n.abs + 1) { |i| i * (n <=> 0) }end
尽管它很短,但这种方法变得非常复杂,并且它的作用并不明显.因此,我更喜欢第一种方法(使用upto和downto的方法)因为它的简单性.
总结以上是内存溢出为你收集整理的arrays – 为正负n创建从0到n的数字数组全部内容,希望文章能够帮你解决arrays – 为正负n创建从0到n的数字数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)