A Pairs and Dicts fogalom a Julia szótártípusának alapjaival foglalkozott.
Mivel a Dict-ek fontos és gyakran használt gyűjteménytípusok, rengeteg függvény áll rendelkezésre a kezelésükre.
Egy bejegyzés legegyszerűbben kulcs alapján kérhető le (ahogy sok más nyelvben is).
Ha viszont egy nem létező kulcsot kérünk le, KeyError-t kapunk.
julia> d = Dict(i => ('a':'c')[i] for i in 1:3)
Dict{Int64, Char} with 3 entries:
2 => 'b'
3 => 'c'
1 => 'a'
julia> d[2]
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
# missing key
julia> d[4]
ERROR: KeyError: key 4 not found
A lekérés előtt ellenőrizhetnénk a kulcs meglétét is (például a haskey(d, 4) hívással), de néha hasznos, ha a hiányzó kulcsokhoz egyszerűen egy alapértelmezett értéket kapunk.
Erre szolgál a get() függvény és annak módosító változata, a get!().
Abban különböznek, hogy a „hiányzó” kulcs bekerül-e a Dict-be.
julia> get(d, 4, '!')
'!': ASCII/Unicode U+0021 (category Po: Punctuation, other)
# get() leaves Dict unchanged
julia> d
Dict{Int64, Char} with 3 entries:
2 => 'b'
3 => 'c'
1 => 'a'
julia> get!(d, 4, '!')
'!': ASCII/Unicode U+0021 (category Po: Punctuation, other)
# get!() adds new key to Dict
julia> d
Dict{Int64, Char} with 4 entries:
4 => '!'
2 => 'b'
3 => 'c'
1 => 'a'
A korábbi fogalomban láttuk, hogy a delete!() kulcs alapján töröl egy bejegyzést.
Ez összeköthető az érték lekérésével a pop!() függvény használatával.
julia> d
Dict{Int64, Char} with 4 entries:
4 => '!'
2 => 'b'
3 => 'c'
1 => 'a'
# popped value is returned
julia> pop!(d, 3)
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
# Dict is shrunk
julia> d
Dict{Int64, Char} with 3 entries:
4 => '!'
2 => 'b'
1 => 'a'
Ha egy Dict-en iterálunk, alapértelmezés szerint key => value párokat kapunk.
Az összetevőket a szokásos .first és .second elnevezéssel érhetjük el.
# d is from the previous example
julia> [(kv.first, kv.second) for kv in d]
3-element Vector{Tuple{Int64, Char}}:
(4, '!')
(2, 'b')
(1, 'a')
Gyakran csak a kulcsokra vagy csak az értékekre van szükségünk, ez pedig egyszerűen megoldható.
julia> [k for k in keys(d)]
3-element Vector{Int64}:
4
2
1
julia> [v for v in values(d)]
3-element Vector{Char}:
'!': ASCII/Unicode U+0021 (category Po: Punctuation, other)
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
Két Dict összevonása hasznos lehet, de tisztázni kell, mi történjen azokkal a kulcsokkal, amelyek egynél több bemenetben is szerepelnek.
A merge() és merge!() függvények tetszőleges számú megadott Dict-et vonnak össze balról jobbra.
A meglévő kulcsok értékeit egyszerűen felülírják, így a jobb szélső Dict „győz”.
julia> d3 = Dict("color" => "red", "shape" => "circle")
Dict{String, String} with 2 entries:
"shape" => "circle"
"color" => "red"
julia> d4 = Dict("color" => "blue", "coords" => (3, 2))
Dict{String, Any} with 2 entries:
"color" => "blue"
"coords" => (3, 2)
# color from d3 is lost
julia> merge(d3, d4)
Dict{String, Any} with 3 entries:
"shape" => "circle"
"color" => "blue"
"coords" => (3, 2)
A mergewith() és mergewith!() függvényeknél az első argumentumként egy függvényt adhatunk meg, amely meghatározza, hogyan vonódjanak össze az ismétlődő kulcsok.
Az összeadás egyszerű példa erre.
julia> d5 = Dict("color" => "red", "area" => 3)
Dict{String, Any} with 2 entries:
"area" => 3
"color" => "red"
julia> d6 = Dict("shape" => "circle", "area" => 5)
Dict{String, Any} with 2 entries:
"shape" => "circle"
"area" => 5
# area values are added, not overwritten
julia> mergewith(+, d5, d6)
Dict{String, Any} with 3 entries:
"shape" => "circle"
"area" => 8
"color" => "red"
Vegyük észre, hogy a mergewith függvények jó példát mutatnak a magasabb rendű függvények működésére.
A Mecha Munch™, egy élelmiszer-bevásárlást automatizáló cég épp most vett fel, hogy a rendelési alkalmazásukon dolgozz. A csapatod feladata, hogy elkészítsen egy MVP-t (minimálisan életképes termék), amely a bevásárlókosár összes alapvető műveletét kezeli, és lehetővé teszi a felhasználóknak, hogy hozzáadják, eltávolítsák és rendezzék a bevásárlásaikat. Szerencsére a pénzzel és a fizetéssel kapcsolatos funkciókat egy másik csapat intézi!
Az MVP-nek lehetővé kell tennie, hogy a felhasználó termékeket adjon a bevásárlókosarához. Ez lehet egyetlen termék vagy egyszerre több termék is. Mivel ez egy MVP, a termék mennyiségét az ismétlődések jelzik. Ha a felhasználó 2 „Oranges”-t szeretne hozzáadni, az „Oranges” kétszer fog megjelenni a bemeneti iterálható sorozatban. Ha a termék már benne van a felhasználó kosarában, a kosárban lévő mennyiséget 1-gyel kell növelni. Ha a termék új a kosárban, akkor 1-es mennyiséggel kell hozzáadni.
Hozd létre az add_items!(<cart>, <items>) függvényt, amely argumentumként egy kosárszótárt és a hozzáadandó termékek iterálható sorozatát kapja.
A függvény adja vissza a felhasználó frissített bevásárlókosár-szótárát.
julia> additems!(Dict("Banana" => 3, "Apple" => 2, "Orange" => 1),
("Apple", "Apple", "Orange", "Apple", "Banana"))
Dict{String, Int64} with 3 entries:
"Apple" => 5
"Orange" => 2
"Banana" => 4
julia> additems!(Dict("Banana" => 3, "Apple" => 2, "Orange" => 1),
["Banana", "Orange", "Blueberries", "Banana"])
Dict{String, Int64} with 4 entries:
"Blueberries" => 1
"Apple" => 2
"Orange" => 2
"Banana" => 5
Az alkalmazásban van egy „ötletek” szakasz, amely különféle konyhák kész receptjeivel van tele. A felhasználó kiválaszthatja bármelyik receptet, és annak minden hozzávalója automatikusan bekerül a bevásárlókosarába. A projektmenedzser megkért, hogy hozz létre egy módot ezeknek az „ötletek” recepteknek a szerkesztésére, mivel a tartalomcsapat folyamatosan módosítja a hozzávalókat és a mennyiségeket.
Hozd létre az update_recipes!(<ideas>, <updates>) függvényt, amely argumentumként egy „ötletek” szótárt és a receptfrissítések szótárát kapja.
A függvény adja vissza a frissített „ötletek” szótárt.
julia>update_recipes!(
Dict("Banana Bread" => Dict("Banana" => 1, "Apple" => 1, "Walnuts" => 1, "Flour" => 1, "Eggs" => 2, "Butter" => 1),
"Raspberry Pie" => Dict("Raspberry" => 1, "Orange" => 1, "Pie Crust" => 1, "Cream Custard" => 1)),
Dict("Banana Bread" => Dict("Banana" => 4, "Walnuts" => 2, "Flour" => 1, "Butter" => 1, "Milk" => 2, "Eggs" => 3))
)
Dict{String, Dict{String, Int64}} with 2 entries:
"Raspberry Pie" => Dict("Cream Custard"=>1, "Raspberry"=>1, "Orange"=>1, "Pie Crust"=>1)
"Banana Bread" => Dict("Eggs"=>3, "Flour"=>1, "Milk"=>2, "Butter"=>1, "Walnuts"=>2, "Banana"=>4)
julia> update_recipes!(
Dict("Banana Bread" => Dict("Banana" => 1, "Apple" => 1, "Walnuts" => 1, "Flour" => 1, "Eggs" => 2, "Butter" => 1),
"Raspberry Pie" => Dict("Raspberry" => 1, "Orange" => 1, "Pie Crust" => 1, "Cream Custard" => 1),
"Pasta Primavera" => Dict("Eggs" => 1, "Carrots" => 1, "Spinach" => 2, "Tomatoes" => 3, "Parmesan" => 2, "Milk" => 1, "Onion" => 1)),
Dict("Raspberry Pie" => Dict("Raspberry" => 3, "Orange" => 1, "Pie Crust" => 1, "Cream Custard" => 1, "Whipped Cream" => 2),
"Pasta Primavera" => Dict("Eggs" => 1, "Mixed Veggies" => 2, "Parmesan" => 2, "Milk" => 1, "Spinach" => 1, "Bread Crumbs" => 1),
"Blueberry Crumble" => Dict("Blueberries" => 2, "Whipped Creme" => 2, "Granola Topping" => 2, "Yogurt" => 3))
)
Dict{String, Dict{String, Int64}} with 4 entries:
"Raspberry Pie" => Dict("Raspberry"=>3, "Orange"=>1, "Pie Crust"=>1, "Cream Custard"=>1, "Whipped Cream"=>2)
"Pasta Primavera" => Dict("Eggs"=>1, "Mixed Veggies"=>2, "Parmesan"=>2, "Milk"=>1, "Spinach"=>1, "Bread Crumbs"=>1)
"Blueberry Crumble" => Dict("Blueberries"=>2, "Whipped Creme"=>2, "Granola Topping"=>2, "Yogurt"=>3)
"Banana Bread" => Dict("Banana"=>1, "Apple"=>1, "Walnuts"=>1, "Flour"=>1, "Eggs"=>2, "Butter"=>1)
Az alkalmazásnak el kell küldenie egy adott felhasználó kosarát a boltba teljesítésre. A boltban dolgozóknak viszont tudniuk kell, hol található a termék, egy egyedi folyosókód segítségével. A „teljesítési kosarat” a termékek folyosókódjai szerint kell rendezni, hogy a bolti dolgozók hatékonyabban dolgozhassanak.
Hozd létre a send_to_store(<cart>, <aislecodes>) függvényt, amely egy felhasználói bevásárlókosarat és egy szótárt kap, amely a bolt folyosószámait tartalmazza.
A függvény adjon vissza egy összevont „teljesítési kosarat”, amelyben minden megrendelt termékhez egy aislecode => quantity pár tartozik.
A termékek a folyosókódjuk sorrendjében jelenjenek meg.
julia> cart = Dict("Orange" => 1, "Milk" => 2, "Banana" => 3, "Apple" => 2, "Chocolate" => 2);
julia> aislecodes = Dict("Orange" => 2.4, "Milk" => 3.3, "Banana" => 2.6, "Apple" => 2.2, "Chocolate" => 5.7);
julia> send_to_store(cart, aislecodes)
5-element Vector{Pair{Float64, Int64}}:
2.2 => 2
2.4 => 1
2.6 => 3
3.3 => 2
5.7 => 2
Az alkalmazás nem adhat le vég nélkül vásárlói rendeléseket. Előbb-utóbb a bolt kifogy majd a különféle termékekből. Ezért az MVP-alkalmazásnak minden alkalommal frissítenie kell a bolt készletét, amikor a felhasználó elküldi a rendelését a boltba. Különben a vásárlók olyan termékeket rendelnek, amelyek valójában nem is elérhetők.
Hozd létre az update_store_inventory!(<inventory>, <cart>) függvényt, amely egy cart és egy inventory argumentumot kap.
A függvény csökkentse a bolt készletének mennyiségeit a „cartban” megrendelt darabszámmal, majd adjon vissza egy szótárt azokról a termékekről, amelyek elfogytak (azaz elérték a 0-t).
julia> inventory = Dict("Banana" => 15, "Apple" => 12, "Orange" => 1, "Milk" => 4);
julia> cart = Dict("Orange" => 1, "Milk" => 2, "Banana" => 3, "Apple" => 2);
julia> update_store_inventory!(inventory, cart)
Dict{String, Int64} with 1 entry:
"Orange" => 0
julia> inventory
Dict{String, Int64} with 4 entries:
"Milk" => 2
"Apple" => 10
"Orange" => 0
"Banana" => 12
A készlet frissítésén túl az alkalmazás a feltöltésben is segíthet. Az MVP-nek képesnek kell lennie arra, hogy egy mini-rendelést készítsen minden olyan termékből, amely egy vásárlói rendelés után elfogyott. Ez segít egyszerűbbé tenni egy nagyobb rendelés elindítását. Ráadásul néha vannak olyan akciós termékek, amelyek csak korlátozott ideig kaphatók, és nincsenek benne a készletlistában. Ha ezek az akciós időszak vége előtt elfogytak, akkor bizonyítottan népszerűek, és felvehetők a készletlistára.
Hozd létre a reorder!(<outofstock>, <stock>) függvényt, amely outofstock és stock argumentumot kap.
A stock szótár a szokásos készletcikkeket és azok újrarendelési mennyiségeit tartalmazza.
Az outofstock szótár az update_store_inventory! eredménye, vagyis a nulla mennyiségű termékek szótára.
Az outofstock mennyiségeit a stock-ban szereplő értékekre kell frissíteni, és vissza kell adni.
Emellett minden olyan terméket az outofstock-ból, amely nem szerepel a stock-ban, fel kell venni a stock-ba 100 alapértelmezett mennyiséggel.
julia> inventory = Dict("Banana" => 15, "Apple" => 12, "Orange" => 1, "Milk" => 4, "Chocolate" => 2);
julia> cart = Dict("Orange" => 1, "Milk" => 2, "Banana" => 3, "Apple" => 2, "Chocolate" => 2);
julia> stock = Dict("Banana" => 150, "Apple" => 120, "Orange" => 120, "Milk" => 45);
julia> outofstock = update_store_inventory!(inventory, cart)
Dict{String, Int64} with 1 entry:
"Orange" => 0
"Chocolate" => 0
julia> reorder!(outofstock, stock)
Dict{String, Int64} with 1 entry:
"Orange" => 120
"Chocolate" => 100
julia> stock
Dict{String, Int64} with 5 entries:
"Milk" => 45
"Apple" => 120
"Chocolate" => 100
"Orange" => 120
"Banana" => 150
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Julia nyelvet 35 fogalom128 feladat segítségével, valódi emberi mentorálással, mindez ingyen.