[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:
(1859 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: 5826

23. Feb 2009, 13:25
Beitrag # 2 von 9
Beitrag ID: #422854
Bewertung:
(1858 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:
(1858 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: 5826

23. Feb 2009, 13:57
Beitrag # 4 von 9
Beitrag ID: #422856
Bewertung:
(1858 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:
(1858 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: 5826

23. Feb 2009, 14:48
Beitrag # 6 von 9
Beitrag ID: #422858
Bewertung:
(1858 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: 5826

23. Feb 2009, 16:31
Beitrag # 7 von 9
Beitrag ID: #422859
Bewertung:
(1858 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:
(1858 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: 5826

23. Feb 2009, 23:07
Beitrag # 9 von 9
Beitrag ID: #422861
Bewertung:
(1858 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

PDF / Print
enfocus_300

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
14.05.2024

Online
Dienstag, 14. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Prozessoptimierung ist ein Teamsport! Keine Software und keine Maschine allein kann Ihnen helfen, die Effizienzpotenziale Ihres Betriebes maximal auszuschöpfen. Von der Auftragsannahme über die Vorstufe und den Druck bis hin zur Weiterverarbeitung – alles muss optimal ineinandergreifen. Apropos Weiterverarbeitung – in vielen Druckbetrieben fristet sie in Sachen Prozessoptimierung immer noch ein Schattendasein. Dabei liegen hier mittlerweile die größten Einsparpotenziale! In einem Webinar von Horizon und Impressed erfahren Sie, wie Sie diese Einsparungen realisieren können. Horizon, bekannt für innovative Lösungen in der Druckweiterverarbeitung, bietet mit iCE LiNK eine Workflowlösung für die Weiterverarbeitung. iCE LiNK überwacht, visualisiert und analysiert Produktionsabläufe und unterstützt bei der Wartung – damit immer alles reibungslos läuft. Den gleichen Anspruch hat der von Impressed entwickelte Impressed Workflow Server – er ist die smarte PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt. Im Webinar zeigen Ihnen die Experten von Horizon und Impressed, wie beide Lösungen im Team die Effizienz und Produktivität Ihres Betriebes steigern können. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Ja

Organisator: Impressed / Horizon

https://www.impressed.de/schulung.php?c=sDetail&sid=327

Einsparpotenziale in der Weiterverarbeitung
Veranstaltungen
16.05.2024

Online
Donnerstag, 16. Mai 2024, 10.00 - 10.30 Uhr

Webinar

Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Günther Business Solutions und Impressed treten in einem Webinar den Gegenbeweis an. Experten beider Unternehmen zeigen, wie Großformatdrucker vom Einsatz zweier bewährter Lösungen profitieren können: • von advanter print+sign von Günther Business Solutions, dem ERP-System für den Großformatdruck, dass alle Phasen der Wertschöpfung im Large Format Printing abdeckt • von Impressed Workflow Server, der smarten PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt Über die Kombination beider Lösungen können Großformatdrucker ihre Prozesse mit modernen Workflows Schritt für Schritt automatisieren – und so zügig deutliche Zeit- und Kosteneinsparungen realisieren. Das Webinar sollten Sie sich nicht entgehen lassen – damit Sie keine Effizienzpotenziale mehr liegen lassen. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Nein

Organisator: Impressed / Günther Business Solutions

https://www.impressed.de/schulung.php?c=sDetail&sid=326

Und es geht doch: Automatisierung im Großformatdruck!