使用pop和unshift方法背后的逻辑或最佳实践是什么?

时间:2014-08-30 23:11:35

标签: ruby arrays methods

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

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

unshift会将事情移回原来的索引,虽然引用都是模糊地预先添加,所以我可以随意取消从未移动过的东西。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

堆栈就像桌上的一堆文件。你可以在那堆上放更多的文件。如果您选择其中一篇论文,您将获得最新的论文。最后,先出原则。

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

答案 1 :(得分:0)

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()会产生不同的后果。将元素从数组的前面移出()效率要低得多,因为所有其他元素都必须移过。如果你的阵列中有1000万个元素怎么办?然后pop()将一个元素放在最后很容易,但是在前面移动一个元素在效率方面是灾难性的。编程语言Perl,Ruby借用了很多东西,以pop()和shift()同样有效的方式创建数组,但我不相信ruby采用类似的策略。

相关问题