[GastForen Programmierung/Entwicklung AppleScript Liste durchsuchen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Liste durchsuchen

pjoern
Beiträge gesamt: 110

23. Feb 2009, 12:10
Beitrag # 1 von 9
Bewertung:
(1761 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo liebe Helfer,

wie kann ich aus der Liste:

set myList to {1, 2, 1, 3, 1, 1, 2, 2, 3, 3}

herauslesen, wie häufig die Ziffer
1 - bzw. - 2 bzw. - 3 in Ihr vorhanden ist?

Vielen Dank für Eure Hilfe!

Gruß,
pjoern
X

Liste durchsuchen

Hans Haesler
  
Beiträge gesamt: 5818

23. Feb 2009, 13:25
Beitrag # 2 von 9
Beitrag ID: #422854
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo pjoern,

für diese Aufgabe gibt es verschiedene Lösungen.

Wie kommt die Liste zustande?
Soll das Script die Vorkommen jedes Elements melden?
Oder gibt es bestimmte Werte, welche es benutzen kann?

Wie soll die Ausgabe des Ergebnisses erfolgen?

Hier schon mal ein Ansatz zum Spielen. :-) Der Dialog fordert auf, eine Zahl einzugeben. Und ein zweiter Dialog verkündet das Resultat.
---
set myList to {1, 2, 1, 3, 1, 1, 2, 2, 3, 3}

try
   set curNumber to text returned of ¬
      (display dialog "Eine Zahl eingeben" default answer "") as number
on error
   display dialog "Nur Zahlen sind erlaubt." buttons "OK" default button 1 with icon 0
   error number -128
end try

set nTimes to 0
if myList contains curNumber then
   repeat with i from 1 to count myList
      if item i of myList is curNumber then
         set nTimes to nTimes + 1
      end if
   end repeat
end if

display dialog "Die Liste enthält die Zahl " & curNumber ¬
   & ": " & return & return & nTimes & " Mal." buttons "OK" default button 1 with icon 1
---
Gruss, Hans


als Antwort auf: [#422853]

Liste durchsuchen

pjoern
Beiträge gesamt: 110

23. Feb 2009, 13:31
Beitrag # 3 von 9
Beitrag ID: #422855
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für deine "spielerische" Lösung :)

Fast zeitgleich habe ich folgendes geschreiben, was die Lösung meine Aufgabe darstellt:
Code
set meine_Liste to {1, 1, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, 1, 1, 3, 2, 4, 4, 6, 5, 6, 5, 4, 5, 2, 5, 1, 4, 1, 2} as list 
set meine_Liste2 to {} as list

repeat with i from 1 to count of meine_Liste
    set mein_Item to item i of meine_Liste
    if mein_Item is not in meine_Liste2 then set end of meine_Liste2 to mein_Item
end repeat


repeat with akt_Zahl in meine_Liste2
    set Zaehler to 0
    set akt_Zahl to akt_Zahl as string
    repeat with j from 1 to count of meine_Liste
        set mein_Item to item j of meine_Liste
        set mein_Item to mein_Item as string
        if akt_Zahl = mein_Item then
            set Zaehler to Zaehler + 1
            beep 1
        end if
    end repeat
    display dialog "Die Seite: " & akt_Zahl & " ist " & Zaehler & "-mal vorhanden!"
end repeat



als Antwort auf: [#422853]

Liste durchsuchen

Hans Haesler
  
Beiträge gesamt: 5818

23. Feb 2009, 13:57
Beitrag # 4 von 9
Beitrag ID: #422856
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo pjoern,

Deine Lösung funktioniert. Aber die Ausführung kann beschleunigt werden.

Beim Definieren von meine_Liste2 braucht es das as list nicht.

Doch was bremst, ist das Konvertieren in Textketten. Also die Zeilen wie set akt_Zahl to akt_Zahl as string weglassen:
---
set meine_Liste to {1, 1, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, 1, 1, 3, 2, 4, 4, 6, 5, 6, 5, 4, 5, 2, 5, 1, 4, 1, 2} as list
set meine_Liste2 to {}

repeat with i from 1 to count of meine_Liste
   set mein_Item to item i of meine_Liste
   if mein_Item is not in meine_Liste2 then set end of meine_Liste2 to mein_Item
end repeat

repeat with akt_Zahl in meine_Liste2
   set Zaehler to 0
   repeat with j from 1 to count of meine_Liste
      if akt_Zahl is item j of meine_Liste then
         set Zaehler to Zaehler + 1
      end if
   end repeat
   display dialog "Die Seite: " & akt_Zahl & " ist " & Zaehler & "-mal vorhanden!"
end repeat
---

Falls gewünscht, könnte die Liste meine_Liste sortiert werden, bevor es in die zweite Wiederholungsschleife geht. Dann würden die Zahlen der Reihe nach angezeigt.

Gruss, Hans


als Antwort auf: [#422853]

Liste durchsuchen

pjoern
Beiträge gesamt: 110

23. Feb 2009, 14:13
Beitrag # 5 von 9
Beitrag ID: #422857
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielen Dank Hans für das entkernen meines Codes.
Ich habe alle Verbesserungen übernommen und muss jetzt sagen, dass das Sortieren der Liste tatsächlich interessant ist.

Wie gehe ich am besten vor?

Gruß,
pjoern


als Antwort auf: [#422853]

Liste durchsuchen

Hans Haesler
  
Beiträge gesamt: 5818

23. Feb 2009, 14:48
Beitrag # 6 von 9
Beitrag ID: #422858
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo pjoern,

bitteschön. Aber hast Du auch meine Verschlimmbesserungen übernommen? ;-)

In der obigen Fassung ist die Ausführung tatsächlich viel schneller. Aber unbrauchbar, weil ich zuviel gekürzt habe: Für jede Zahl werden Null Vorkommen gemeldet ...

Das Problem ist die Wiederholung, welche repeat with akt_Zahl benutzt. Dort muss ein automatischer Zähler eingesetzt werden:
---
set meine_Liste to {1, 1, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, 1, 1, 3, 2, 4, 4, 6, 5, 6, 5, 4, 5, 2, 5, 1, 4, 1, 2}
set meine_Liste2 to {}

repeat with i from 1 to count of meine_Liste
   set mein_Item to item i of meine_Liste
   if mein_Item is not in meine_Liste2 then set end of meine_Liste2 to mein_Item
end repeat

repeat with i from 1 to count meine_Liste2
   set akt_Zahl to item i of meine_Liste2
   set Zaehler to 0
   repeat with j from 1 to count of meine_Liste
      if akt_Zahl is (item j of meine_Liste) then
         set Zaehler to Zaehler + 1
      end if
   end repeat
   display dialog "Die Seite: " & akt_Zahl & " ist " & Zaehler & "-mal vorhanden!"
end repeat
---
So ist es besser.

Für die Sortierung komme ich später wieder. Ich muss gleich weg.

Gruss, Hans


als Antwort auf: [#422853]

Liste durchsuchen

Hans Haesler
  
Beiträge gesamt: 5818

23. Feb 2009, 16:31
Beitrag # 7 von 9
Beitrag ID: #422859
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo pjoern,

und hier ist ein Handler eingebaut, welcher meine_Liste2 sortiert.
Code
set meine_Liste to {1, 1, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, ¬ 
  1, 1, 3, 2, 4, 4, 6, 5, 6, 5, 4, 5, 2, 5, 1, 4, 1, 2}
set meine_Liste2 to {}

repeat with i from 1 to count of meine_Liste
  set mein_Item to item i of meine_Liste
  if mein_Item is not in meine_Liste2 then
    set end of meine_Liste2 to mein_Item
  end if
end repeat

set nItems to count meine_Liste2
set meine_Liste2 to (quickSort(meine_Liste2, 1, nItems))

repeat with i from 1 to nItems
  set akt_Zahl to item i of meine_Liste2
  set Zaehler to 0
  repeat with j from 1 to count meine_Liste
    if akt_Zahl is (item j of meine_Liste) then
      set Zaehler to Zaehler + 1
    end if
  end repeat
  display dialog "Die Seite " & akt_Zahl & ¬
    " ist " & Zaehler & "-mal vorhanden!"
end repeat

on quickSort(a, L, R)
  script
    property aList : a
  end script
  tell result
    set ctr to L
    set n to R
    set aRef to item L of its aList
    repeat while ctr < n
      repeat while (aRef < item n of its aList) and (ctr < n)
        set n to n - 1
      end repeat
      if n is not ctr then
        set item ctr of its aList to item n of its aList
        set ctr to ctr + 1
      end if
      repeat while (aRef > item ctr of its aList) and (ctr < n)
        set ctr to ctr + 1
      end repeat
      if n is not ctr then
        set item n of its aList to item ctr of its aList
        set n to n - 1
      end if
    end repeat
    set item n of its aList to aRef
    if L < n then
      quickSort(its aList, L, n - 1)
    end if
    if R > ctr then
      quickSort(its aList, ctr + 1, R)
      return its aList
    end if
  end tell
end quickSort

Gruss, Hans


als Antwort auf: [#422853]

Liste durchsuchen

Anonym
Beiträge gesamt: 22827

23. Feb 2009, 18:57
Beitrag # 8 von 9
Beitrag ID: #422860
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hallo hans, hallo pjörn

da hat mich doch der sportliche ehrgeiz gepackt, eine alternativlösung zu liefern. das wäre meine version (ich mag's gern kurz):

set meine_Liste to {1, 1, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, 1, 1, 3, 2, 4, 4, 6, 5, 6, 5, 4, 5, 2, 5, 1, 4, 1, 2}
set AppleScript's text item delimiters to "\n"
set vorhandene to paragraphs of (do shell script "sort -u <<< " & quoted form of (meine_Liste as text))

repeat with zahl in vorhandene
&#160;&#160;&#160;set vorkommen to do shell script "grep -c " & quoted form of zahl & "<<< " & quoted form of (meine_Liste as text)
&#160;&#160;&#160;display dialog "Die Seite " & zahl & " ist " & vorkommen & "-mal vorhanden!"
end repeat
set AppleScript's text item delimiters to ""



was mich echt verblüfft hat: hans lösung ist bei der vorgegebenen liste deutlich schneller (ein vielfaches, allerdings in millisekunden gemessen). ist die liste allerdings deutlich länger, zieht mein script an der lösung von hans vorbei. ein vorteil meiner lösung: es funktioniert auch mit strings in der liste oder einem mix aus zahlen und strings, ist somit universeller einsetzbar.


als Antwort auf: [#422853]

Liste durchsuchen

Hans Haesler
  
Beiträge gesamt: 5818

23. Feb 2009, 23:07
Beitrag # 9 von 9
Beitrag ID: #422861
Bewertung:
(1760 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Holgi,

innerhalb der Zeitspanne, die gemessen wird, darf kein Dialog gezeigt werden, welchen der Anwender quittieren muss. Sonst wird das Ergebnis garantiert verfälscht.

Also: Entweder den Dialog mit 'giving up after 1' automatisieren; oder auskommentieren; oder Zwischenzeiten nehmen und addieren.

Die Lösung von pjoern, welche ich etwas optimiert hatte, stellt sich tatsächlich als schneller heraus, obwohl sie zwei Bremser enthält: Das Erstellen der Liste 2 und – vor allem – das Einen-nach-dem-anderen-Begrüssen (per Handschlag!) aller Werte der langen Liste.

Mit ein paar raschen Versuchen ermittelte ich eine Anzahl von ungefähr 250 Elementen als Grenze, wo die Methode Holgi langsam die Oberhand gewinnt. Aber es handelt sich immer noch um vernachlässigbare Zehntelssekunden.

Doch diese Grenze kann sehr weit hinaufgesetzt werden, denn wir haben noch eine Trumpfkarte im Ärmel: Das Wörtchen my :-)

Bei den zwei Befehlen, welche die lange Liste adressieren, eingesetzt. Die Zahl der Elemente der Liste 1 auf 1200 erhöht und die Zeit gestoppt.

Ergebnis
Code
Methode Hans:  Zwischen 140 und 160 Millisekunden.  
Methode Holgi: Zwischen 360 und 380 Millisekunden.


Nachstehend nochmals das Script mit den eingefügten "my". Das Zählen der Elemente ist nun ebenfalls optimiert. Der Dialog ist auskommentiert, damit das Stoppen der Zeit nicht negativ beeinflusst wird.
Code
set t1 to get GetMilliSec 

set meineListe1 to {1, 1, 1, 2, 2, 3, 1, 2, 3, 3, 1, 2, ¬
  1, 1, 3, 2, 4, 4, 6, 5, 6, 5, 4, 5, 2, 5, 1, 4, 1, 2}

set nItems1 to count meineListe1
set meineListe2 to {}

repeat with i from 1 to nItems1
  set meinItem to item i of my meineListe1
  if meinItem is not in meineListe2 then
    set end of meineListe2 to meinItem
  end if
end repeat

set nItems2 to count meineListe2
set meineListe2 to (quickSort(meineListe2, 1, nItems2))

repeat with i from 1 to nItems2
  set aktZahl to item i of meineListe2
  set Zaehler to 0
  repeat with j from 1 to nItems1
    if aktZahl is (item j of my meineListe1) then
      set Zaehler to Zaehler + 1
    end if
  end repeat
  --  display dialog "Die Seite " & aktZahl & ¬
  " ist " & Zaehler & "-mal vorhanden!"
end repeat

set t2 to get GetMilliSec
display dialog "" & (t2 - t1) & " Millisekunden"

on quickSort(a, L, R)
  script
    property aList : a
  end script
  tell result
    set ctr to L
    set n to R
    set aRef to item L of its aList
    repeat while ctr < n
      repeat while (aRef < item n of its aList) and (ctr < n)
        set n to n - 1
      end repeat
      if n is not ctr then
        set item ctr of its aList to item n of its aList
        set ctr to ctr + 1
      end if
      repeat while (aRef > item ctr of its aList) and (ctr < n)
        set ctr to ctr + 1
      end repeat
      if n is not ctr then
        set item n of its aList to item ctr of its aList
        set n to n - 1
      end if
    end repeat
    set item n of its aList to aRef
    if L < n then
      quickSort(its aList, L, n - 1)
    end if
    if R > ctr then
      quickSort(its aList, ctr + 1, R)
      return its aList
    end if
  end tell
end quickSort


Nicht getestet habe ich, wie sich eine grössere Anzahl von verschiedenen Zahlen auswirken würde. Und auch eine weitere Idee, mit welcher die zweite, kurze Liste nicht erstellt werden muss, habe ich nicht ausprobiert.

Gruss, Hans


als Antwort auf: [#422853]
X

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/