[Julia] 資料結構 – Dictionary、Tuple、Array

介紹 Dictionary、Tuple、Array 這三種資料結構。

Dictionary 資料結構

Dictionary 資料結構是沒有順序性的,且可以修改資料。

宣告:

myphonebook = Dict("Jenny" => "867-5309", "Ghostbusters" => "555-2368")

取得資料:

myphonebook["Jenny"]

新增一筆資料:

myphonebook["Kramer"] = "555-FILK"

查看目前的資料:

myphonebook

透過 pop! 刪除 Kramer 這筆資料,並且馬上回傳 Kramer 的資料內容:

pop!(myphonebook, "Kramer")

以下程式是錯的,因為 Dictionary 是沒有順序性的,故無法透過索引來取值:

myphonebook[1]

// 會顯示以下的錯程訊息:
KeyError: key 1 not found

Stacktrace:
 [1] getindex(::Dict{String,String}, ::Int64) at ./dict.jl:478
 [2] top-level scope at In[7]:1

Tuple 資料結構

Tuple 是有順利性的,可以用 (item1, item2, ...)語法來建立,但用 Tuple 建立的資料結構,是不能被修改的。

例如建立了以下的 Tuple 資料結構:

myfavoriteanimals = ("penguins", "cats", "sugargliders")

然後可以透過以下索引來取得值(這裡要注意的是索引是從 1 開始算起):

myfavoriteanimals[1]

// 這個會取得 penguins

以下程式是會出錯的,因為 Tuple 是不能被修改的資料結構:

myfavoriteanimals[1] = "otters"

// 會出現如下錯誤:
MethodError: no method matching setindex!(::Tuple{String,String,String}, ::String, ::Int64)

Stacktrace:
 [1] top-level scope at In[5]:1

Tuple 也可以給定名稱給裡面的各個資料,例:

myfavoriteanimals = (bird = "penguins", mammal = "cats", marsupial = "sugargliders")

可以透過以下方式來取值:

myfavoriteanimals[1]
myfavoriteanimals.bird

Array 資料結構

跟 Tuple 的主要差異,是在於 Array 是可以被修改的資料結構。

可以透過以下語法來建立 Array:

[item1, item2, ...]

例:

myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]

// 回傳如下:
5-element Array{String,1}:
 "Ted"     
 "Robyn"   
 "Barney"  
 "Lily"    
 "Marshall"

上述的回傳結果,其中 Array{String,1} 裡的 1 ,表示的是一維陣列,而 String 所代表的是各元素的類型。

再看下例:

fibonacci = [1, 1, 2, 3, 5, 8, 13]

// 回傳如下:
7-element Array{Int64,1}:
  1
  1
  2
  3
  5
  8
 13

留意上述的 Array{Int64,1}

再看下例的回傳結果:

mixture = [1, 1, 2, 3, "Ted", "Robyn"]

// 回傳如下:
6-element Array{Any,1}:
 1       
 1       
 2       
 3       
  "Ted"  
  "Robyn"

上述留意 Array{Any,1}

可以透過以下的方式來取得 Array 陣列裡的值(這裡要注意的是索引是從 1 開始算起):

myfriends[3]

// 回傳結果是 Barney

可以透過以下方式來更新某個元素的值:

myfriends[3] = "Baby Bop"

接下來介紹兩個函式 push! 和 pop!

以下例子是在 fibonacci 陣列的最後,增加一個 21 這個元素:

push!(fibonacci, 21)

// 回傳結果
8-element Array{Int64,1}:
  1
  1
  2
  3
  5
  8
 13
 21

以下例子是在 fibonacci 移除最後的元素:

pop!(fibonacci)

// 回傳結果(回傳被移除的值)
21

最後再透過以下程式來顯示目前的 fibonacci 陣列:

fibonacci

// 回傳結果
7-element Array{Int64,1}:
  1
  1
  2
  3
  5
  8
 13

陣列裡也可以放陣列,例:

favorites = [["koobideh", "chocolate", "eggs"],["penguins", "cats", "sugargliders"]]

// 回傳結果
2-element Array{Array{String,1},1}:
 ["koobideh", "chocolate", "eggs"]   
 ["penguins", "cats", "sugargliders"]
numbers = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]

// 回傳結果
3-element Array{Array{Int64,1},1}:
 [1, 2, 3]   
 [4, 5]      
 [6, 7, 8, 9]

陣列可以透過以下方式來建立二維陣列或三維陣列(rand 是產生 0 ~ 1 的任意數):

rand(4, 3)

// 回傳結果
4×3 Array{Float64,2}:
 0.172895  0.150698   0.763717
 0.723269  0.0483332  0.481303
 0.379501  0.625475   0.301082
 0.557059  0.423749   0.467026
rand(4, 3, 2)

// 回傳結果
[:, :, 1] =
 0.219817   0.254453  0.266652
 0.272472   0.50452   0.250482
 0.640402   0.453724  0.637949
 0.0060794  0.800476  0.113048

[:, :, 2] =
 0.801163  0.715645  0.823987
 0.801253  0.946617  0.652424
 0.486263  0.918739  0.010355
 0.578055  0.270515  0.551651

最後介紹陣列如果是真的想要「複製」陣列的話,可以使用 copy 函式:

somemorenumbers = copy(fibonacci)

像上述這樣,如果修改 somemorenumbers 陣列的話,並不會影響到 fibonacci 陣列。

您可在此處留言

avatar

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料

  Subscribe  
Notify of