使用索引将项添加到新数组

时间:2015-06-26 04:36:51

标签: arrays ruby

尝试创建一个方法skip_animals,该方法采用animals数组和skip整数,并返回除第一个skip个项目之外的所有元素的数组。

输入:skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)

预期输出:["2:fox", "3:wolf"]

   def skip_animals(animals, skip)
        arr = Array.new
        animals.each_with_index{|animal, index| arr.push("#{animal}:#{index}") }
        puts arr.drop(skip)
    end

而是在单独的一行上输出puts,而不是将它们添加到数组arr。我认为arr.push会正确添加它们。如何将元素添加到数组中?

我想使用这些方法,而不是map或更先进的方法。我需要修改这个each_with_index行,而不是彻底检查它。

(这是对Hackerrank的挑战,所以它使用STDIN和STDOUT)

修改

以下是我使用p代替puts的更新代码。它给了我两个不同数组的奇怪输出,不知道为什么。

def skip_animals(animals, skip)
    arr = Array.new
    animals.each_with_index{|animal, index| arr.push("#{index}:#{animal}") }
    p arr.drop(skip)
end

这给了我两行输出:

["3:panda", "4:tiger", "5:deer"]
["0:leopard", "1:bear", "2:fox", "3:wolf", "4:dog", "5:cat"]

我假设顶部是正确的数组,但我不明白为什么第二个也是打印,或者为什么它有一组不同的动物。

2 个答案:

答案 0 :(得分:1)

使用p代替puts

irb(main):001:0> puts ['1', '2']
1
2
=> nil
irb(main):002:0> p ['1', '2']
["1", "2"]

根据the documentationputs

  

将给定对象写入ios,与IO#print一样。写一条记录   在任何尚未结束的分隔符之后的分隔符(通常是换行符)   换行序列。 如果使用数组参数调用,则写入每个参数   新行上的元素。如果不带参数调用,则输出单个元素   记录分隔符。

顺便说一句,我会像这样编码(使用Enumerable#map +返回结果而不是在函数内打印):

def skip_animals(animals, skip)
  animals.drop(skip).each_with_index.map { |animal, index|
    ("#{index + skip}:#{animal}")
  }
end

p skip_animals(['leopard', 'bear', 'fox', 'wolf'], 2)

答案 1 :(得分:0)

只需从此行puts

中移除puts arr.drop(skip)
def skip_animals(animals, skip)
    arr = Array.new
    animals.each_with_index{|animal, index| arr.push("#{animal}:#{index}") }
    arr.drop(skip)
end