Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 13.03.2010 - 01:20 Titel: binärer Suchbaum |
|
|
Ich brauchte für eine kleines Script eine Datenstruktur in der ich Werte unter Namen speichern kann. In diesem Fall ging es darum, herauszufinden, wieviele Stücke ein Album in iTunes hat. Es mußte also ein Zähler für jeden gefundenen Albumnamen her.
In Perl ist sowas einfach. Da nimmt man einen hash. AppleScript bietet eine solche Datenstruktur nicht. Also habe ich mir folgendes kleine Script geschrieben.
Es ist nicht perfekt.
- Wenn man sortiert einfügt, erhält man eine Liste. Zum Suchen muß also die gesamte Liste bis zum Treffer durchgegangen werden
- Man kann nur einfügen aber nicht löschen
Code: | set h to new_bintree()
tell h
store("O", 15)
store("E", 5)
store("P", 16)
store("C", 3)
store("L", 12)
store("T", 20)
store("J", 10)
store("N", 13)
store("R", 18)
store("W", 23)
store("F", 6)
store("G", 7)
fetch("L")
-- 12
keys()
-- {"C", "E", "F", "G", "J", "L", "N", "O", "P", "R", "T", "W"}
values()
-- {3, 5, 6, 7, 10, 12, 13, 15, 16, 18, 20, 23}
treelist()
-- {{{{"C", 3}}, {"E", 5}, {{{{"F", 6}, {{"G", 7}}}, {"J", 10}}, {"L", 12}, {{"N", 13}}}}, {"O", 15}, {{"P", 16}, {{{"R", 18}}, {"T", 20}, {{"W", 23}}}}}
end tell
on new_bintree()
script entry
property my_key : missing value
property my_val : missing value
property lower : missing value
property higher : missing value
to store(new_key, new_val)
-- log ("store(" & new_key & ", " & new_val & ")")
if my_key is missing value then
set my_val to new_val
set my_key to new_key as string
return
end if
if new_key is my_key then
set my_val to new_val
return
end if
if new_key > my_key then
if higher is missing value then
set higher to new_bintree()
end if
return higher's store(new_key, new_val)
else if lower is missing value then
set lower to new_bintree()
end if
return lower's store(new_key, new_val)
end store
to fetch(a_key)
-- log ("fetch(" & a_key & ")")
if my_key is missing value then
return missing value
end if
set a_key to a_key as string
if my_key is a_key then
return my_val
end if
if a_key > my_key then
if higher is missing value then
return missing value
end if
return higher's fetch(a_key)
end if
if lower is missing value then
return missing value
end if
return lower's fetch(a_key)
end fetch
to keys()
if lower is not missing value then
set keylist to lower's keys()
else
set keylist to {}
end if
copy my_key to the end of keylist
if higher is not missing value then
return keylist & higher's keys()
end if
return keylist
end keys
to values()
if lower is not missing value then
set valuelist to lower's values()
else
set valuelist to {}
end if
copy my_val to the end of valuelist
if higher is not missing value then
return valuelist & higher's values()
end if
return valuelist
end values
to treelist()
if lower is not missing value then
set t to {lower's treelist()}
else
set t to {}
end if
copy {my_key, my_val} to the end of t
if higher is not missing value then
copy higher's treelist() to the end of t
end if
return t
end treelist
end script
return entry
end new_bintree
|
Update: Fehler behoben. "key" muß String sein. _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies")
Zuletzt bearbeitet von Skeeve am 28.03.2010 - 21:50, insgesamt einmal bearbeitet |
|