今天要來聊聊資料結構的部分,關於資料要以何種方式存取 ( 選擇 Hash 或 Array )
推薦讀者自己也想一個例子來寫,店家、菜單、學校...等越生活化越容易想像,我自己是透過這樣的方式才真的明白這兩種資料型態的!
例子:小華開了 N 間的連鎖餐飲店,需要店名、電話、商品項目、商品價格、商品數量
( 以下程式註解的原因是執行這個檔案時,會印出太多資料,所以這文章就只開部分欄位 )
store =[
{
store_name:'台北店',
phone:'02-1234-5678',
# adress:'台北市中正區OO路0號',
# manager:'john',
product_all:{
bread:{
price:15,
quantity:8,
# manufacturer:'aaa company',
# cost:7
},
tea:{
price:20,
quantity:19,
# manufacturer:'bbb company',
# cost:10
},
pizza:{
price:50,
quantity:10,
# manufacturer:'ccc company',
# cost:30
}
}
},
{
store_name:'台中店',
phone:'04-987-6543',
# adress:'台中市清水區OO路0號',
# manager:'ann',
product_all:{
noodle:{
price:80,
quantity:50,
# manufacturer:'ddd company',
# cost:37'
},
soup:{
price:20,
quantity:12,
# manufacturer:'eee company',
# cost:9
},
pizza:{
price:50,
quantity:1,
# manufacturer:'ccc company',
# cost:30
}
}
}
]
step 1:
先取出小華所有的店及其資訊:
puts store
執行結果:
{:store_name=>"台北店", :phone=>"02-1234-5678", :product_all=>{:bread=>{:price=>15, :quantity=>8}, :tea=>{:price=>20, :quantity=>19}, :pizza=>{:price=>50, :quantity=>10}}}
{:store_name=>"台中店", :phone=>"04-987-6543", :product_all=>{:noodle=>{:price=>80, :quantity=>50}, :soup=>{:price=>20, :quantity=>12}, :pizza=>{:price=>50, :quantity=>1}}}
step 2:
因為小華有N間店,但他總是記不住有什麼店,如果用hash的key去紀錄"XX店"再去取其value,就只能用XX店當索引值,但是對記憶力不好的小華來說,記得店名實在有困難,因此我使用Array去紀錄,當小華想要知道第2間店是誰,包含店名、電話、商品等相關資訊:
puts store[1]
執行結果:
{:store_name=>"台中店", :phone=>"04-987-6543", :product_all=>{:noodle=>{:price=>80, :quantity=>50}, :soup=>{:price=>20, :quantity=>12}, :pizza=>{:price=>50, :quantity=>1}}}
step 3:
小華只想知道這間店販售了多少品項的東西,不需要第2間店的詳細資料(phone、adress、manager等):
puts store[1][:product_all]
執行結果:
{:noodle=>{:price=>80, :quantity=>50}, :soup=>{:price=>20, :quantity=>12}, :pizza=>{:price=>50, :quantity=>1}}
step 4:
小華現在要針對Pizza這個品項做些管理,發現數量低於5,表示銷售非常好,想再增加進貨量,並且與該供應商議價,希望取得比原先cost還低的價格:
puts store[1][:product_all][:pizza][:quantity] < 5
執行結果:
true
puts store[1][:product_all][:pizza]
執行結果:
{:price=>50, :quantity=>1, :manufacturer=>'ccc company', :cost=>30}
以上是我設計這個資料結構的想法,當然也還有很多種排列組合,每一層要用array還是hash包資料都可以,沒有好與壞,優先考慮的是自己想要如何撈取資料,再來決定什麼方式最適合。
學無止盡,每天進步一點點!