Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
era •->

Anmeldedatum: 30.03.2012 Beiträge: 1
|
Verfasst am: 30.03.2012 - 00:17 Titel: kurze Frage |
|
|
ich habe vier variablen (alles zahlen, also Ints) und möchte die größten drei davon nehmen. wie mache ich das ohne riesige if-abfragen? |
|
Nach oben |
|
 |
woodpecker •--->

Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 30.03.2012 - 09:31 Titel: |
|
|
Du könntest die Zahlen untereinander in eine Textdatei schreiben. Mit
Code: | set x to do shell script "sort -n -r datei | head -3" |
erhältst Du dann in x die gesuchten Zahlen (in jeder Zeile eine). |
|
Nach oben |
|
 |
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 448 Wohnort: Geldern
|
Verfasst am: 30.03.2012 - 16:20 Titel: |
|
|
Hallo era, Hallo woodpecker,
So gerne ich Shellscripte benutze, in dem Fall würde ich davon strikt Abstand nehmen. Kostet in dem Fall ungeheuer viel Zeit (weiß ja nicht, was era da für ein Projekt hat).
Hier eine reine AppleScript-Umsetzung:
Code: | set {v1, v2, v3, v4} to {17, 11, 3, 77} # willkürliche Zuweisung, nur zur Hilfe
# Ich nehme an, Du hast also nun die willkürlichen Variablen. Schritt 1: In eine Liste packen:
set meinewerte to {v1, v2, v3, v4}
# Schritt 2 und Rest: Sortieren; nehmen der drei größten Werte:
set meinewerte to my quicksortneugepimpt(1, count items of meinewerte, meinewerte)
return items -3 thru -1 of meinewerte
on quicksortneugepimpt(Beginn, Ende, liste) -- Supermächtige Sortierroutine von C. A. R. Hoare, modernisiert und verständlichere Version vom 19.4.2011 (bisher immer 1:1 unverändert mit alt anmutender Syntax eingebaut) von Martin Wolter, martin_wolter@gmx.de
considering case
script listenspeicher
property listefest : liste
end script
set LinkerWert to Beginn
set RechterWert to Ende
set StartWert to item ((Beginn + Ende) div 2) of liste
repeat until RechterWert is less than or equal to LinkerWert
repeat while item LinkerWert of listefest of listenspeicher is less than StartWert
set LinkerWert to LinkerWert + 1
end repeat
repeat while item RechterWert of listefest of listenspeicher is greater than StartWert
set RechterWert to RechterWert - 1
end repeat
if LinkerWert is less than or equal to RechterWert then
set tempvar to item LinkerWert of listefest of listenspeicher
set item LinkerWert of listefest of listenspeicher to item RechterWert of listefest of listenspeicher
set item RechterWert of listefest of listenspeicher to tempvar
set LinkerWert to LinkerWert + 1
set RechterWert to RechterWert - 1
end if
end repeat
if Beginn is less than RechterWert then tell me to quicksortneugepimpt(Beginn, RechterWert, listefest of listenspeicher)
if Ende is greater than LinkerWert then tell me to quicksortneugepimpt(LinkerWert, Ende, listefest of listenspeicher)
end considering
return liste
end quicksortneugepimpt |
Kern der Methode: Du kommst mit gar keiner if-Abfrage aus. Sondern Du sortierst Dir Deine 4 Variablenwerte einfach und nimmst dann die drei Größten – fertig!
Der Quicksort-Handler ist quasi ein Geschenk an die AS-Gemeinde, ich veröffentliche ihn hier erstmals. Er ist wesentlich performanter als die üblichen, die man da so kennt ;-) _________________ Martin Wolter
--
Apple rocks the planet! |
|
Nach oben |
|
 |
woodpecker •--->

Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
|
Verfasst am: 30.03.2012 - 19:11 Titel: |
|
|
Hallo Martin,
da hast Du natürlich recht. Zeitaufwendiger ist es allemal. Aber ich hatte die Anfrage so verstanden, dass es nur ein einmaliger Aufruf sein soll. In dem Fall würde es nicht ins Gewicht fallen.
Übrigens: Ich habe das mal getestet. Das Laufzeitverhältnis bei mir beträgt etwa 1:200.
Gruß woodpecker |
|
Nach oben |
|
 |
hubionmac •--->


Anmeldedatum: 26.02.2004 Beiträge: 245 Wohnort: Münster
|
|
Nach oben |
|
 |
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1068
|
Verfasst am: 02.04.2012 - 22:41 Titel: Re: kurze Frage |
|
|
era hat Folgendes geschrieben: | ich habe vier variablen (alles zahlen, also Ints) und möchte die größten drei davon nehmen. wie mache ich das ohne riesige if-abfragen? |
Wenn's nur 4 sind, sind das 3 if-abfragen:
Code: |
set {v1, v2, v3, v4} to {17, 11, 3, 77}
set groeste3 to {}
set kleinste to v1
if kleinste < v2 then
copy v2 to the end of groeste3
else
copy kleinste to the end of groeste3
set kleinste to v2
end if
if kleinste < v3 then
copy v3 to the end of groeste3
else
copy kleinste to the end of groeste3
set kleinste to v3
end if
if kleinste < v4 then
copy v4 to the end of groeste3
else
copy kleinste to the end of groeste3
set kleinste to v4
end if
groeste3 |
_________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2002 phpBB Group Deutsche Übersetzung von phpBB.de
|
|
|