【问题标题】:What's the logic behind or best practices with the pop and unshift methods? [closed]pop 和 unshift 方法背后的逻辑或最佳实践是什么? [关闭]
【发布时间】:2014-08-30 23:11:35
【问题描述】:

我可以使用push 将元素推送到数组中。如果我创建一个数组a = ["alice", "bob"]a[0] = "alice"a[1] = "bob"。我可以推送"carl",它位于a[2]。但我为什么要pop 出去并退回呢?

shift 方法对我来说很有意义,因为它删除了第一个索引元素并将其余元素移动一个索引。我可以使用a.shift"alice" 移出数组并返回"alice",效果是"bob" 现在位于a[0] 而不是a[1]

unshift 会将事物移回其原始索引,尽管这些引用都含糊其辞地前置,这样我就可以任意取消移动从未移动过的东西。

我可能想要一致地对数组进行操作,因此将新元素添加到一侧,并从另一侧删除它们。例如,如果元素在某个过程中循环,则处理并移动第一个元素并将任何新元素推到队列末尾是有意义的。

将元素添加到数组(并更改每个元素的索引)或弹出最近添加的元素有什么好处或在什么情况下有好处?

【问题讨论】:

  • 除了 pop/push 更快之外,这实际上取决于您是要在开头还是结尾添加元素

标签: ruby arrays methods


【解决方案1】:

我们需要这些方法来实现两种不同的数据结构:堆栈和队列。

队列就像超市里的队列。列表中的第一个获得服务。新客户在最后等待。

一摞就像你桌上的一堆文件。你可以在那一堆上放更多的文件。如果你拿其中一篇论文,你会得到最新的一篇。后进先出原则。

我认为这就是你不能像“普通”语言那样学习计算机语言的原因。因为你需要了解它背后的概念:常见的数据结构、知名的算法、复杂的类......

【讨论】:

  • 谢谢。这正是我需要给我的研究更多方向的东西。
【解决方案2】:
But why would I want to pop it out and return it?

这是一个使用 pop() 可以做什么的示例:

dispatcher = {
  "+" => lambda {|x, y| x+y},
  "-" => lambda {|x, y| x-y},
  "*" => lambda {|x, y| x*y},
}

print "Enter two values followed by an operation(+, -, *): "
input_arr = gets.chomp.split()

func = dispatcher[input_arr.pop]  #Remove the operation from the array, so that you can...

input_arr = input_arr.map {|val| val.to_i}  #...call to_i() on the rest of the elements
result = func.call(*input_arr)
puts result

--output:--
$ ruby my_prog.rb 
Enter two values followed by an operation(+, -, *): 3 2 +
5
~/ruby_programs$ ruby my_prog.rb
Enter two values followed by an operation(+, -, *): 3 2 -
1
~/ruby_programs$ ruby my_prog.rb
Enter two values followed by an operation(+, -, *): 3 2 *
6

当您学习编程语言时,您就是在学习技巧。您可能无法想象一个技巧有什么用处,但是随着您获得更多经验,您会想到一个编程问题,并希望您知道的相关技巧会浮现在脑海中。

另外,你应该知道 pop() 和 shift() 有不同的结果。 shift() 一个元素离开数组前面的效率要低得多,因为所有其他元素都必须移过。如果您的数组中有 1000 万个元素怎么办?然后将元素从末尾弹出()很容易,但是将元素从前面移开在效率方面是灾难性的。 Ruby 借鉴了很多编程语言 Perl,它创建数组的方式使得 pop() 和 shift() 效率相同,但我不认为 ruby​​ 采用了类似的策略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多