n=[1,2,3,nil,nil]p nn1=n.compactp n1n2=n.compact!p n2p n
主要是交流,水平有限,喜歡研究,多多包涵。
先說一個數組迴圈問題
arr=[1,2,3]n=arr << arrp n輸出: [1, 2, 3, [...]]
分析:
<< 傳進去的是一個arr指標 # =>[1,2,3,arr]
其實這是一個迴圈,真實的值是:[1,2,3,[1,2,3,[1,2,3,[1,2,3,........]]]
arr[3]=arr
arr[3][3]=arr
ruby數組比較常用的方法:
1.at方法
arr=[1,2,3]p arr.at(2)p arr[2]
其實:at比[]方法要效率一點,因為它不接受range參數
測試:
require 'benchmark'n=(1..1000000).to_al=n.lengthBenchmark.bm do |bm| bm.report("at") do i=0 while i< l n.at(i) i+=1 end end bm.report("[]") do i=0 while i< l n[i] i+=1 end end end輸出: user system total realat 0.610000 0.000000 0.610000 ( 0.609000)[] 0.625000 0.000000 0.625000 ( 0.625000)
結論:大數組的擷取元素首選at
2.compact delete方法
n=[1,2,3,nil,nil]p nn1=n.compactp n1n2=n.compact!p n2p n
刪除數組中nil的元素,帶!返回數組本身,如果數組中沒有nil,不帶!返回Nil,帶!返回數組本身。
n=[1,2,3,nil,nil]p n.delete(nil)p n
delete方法也可以刪除所有nil元素,比較下效能:
require 'benchmark'n=Array.new(100000000,nil)n1=Array.new(100000000,nil)Benchmark.bm do |bm| bm.report("delete") do n.delete(nil) end bm.report("compact") do n1.compact end end user system total realdelete 0.718000 0.016000 0.734000 ( 0.735000)compact 1.360000 0.062000 1.422000 ( 1.453000)
結論:刪除元素首選 delete
3.比較下for each while
require 'benchmark'n=(1..100000).to_aBenchmark.bm do |bm| bm.report("each") do n.each do |d| d end end bm.report("for") do for i in n i end end bm.report("while") do i=0 while i< n.length n[i] i+=1 end endend user system total realeach 0.015000 0.000000 0.015000 ( 0.015000)for 0.016000 0.000000 0.016000 ( 0.016000)while 0.078000 0.000000 0.078000 ( 0.078000)
結論:each 很效率
4.flatten方法
n=[1,2,3]n1=[4,5,6]n2=[n1,n]p n2p n2.flatten#[[4, 5, 6], [1, 2, 3]][4, 5, 6, 1, 2, 3]
5.sort與自訂方法比較
require 'benchmark'n=(1..100).to_an1=(23..89).to_an2=(900..3003).to_an=n2+n1+n#自訂方法是網上找的def bubble_sort(arr) 1.upto(arr.length-1) do |i| (arr.length-i).times do |j| if arr[j]>arr[j+1] arr[j],arr[j+1] = arr[j+1],arr[j] end end end arrendBenchmark.bm do |bm| bm.report("sort") do n.sort end bm.report("personal") do bubble_sort(n) end end user system total realsort 0.000000 0.000000 0.000000 ( 0.000000)personal 3.109000 0.109000 3.218000 ( 3.220000)
結論:坑爹啊,ruby內建方法還是很強大的,首選內建方法sort
6.uniq方法
刪除數組的重複元素,測試就不測了,類似於上面的sort.