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 | 
			 
		  |