Wie zähle ich ein bestimmtes Zeichen in einer Zeile?

Startseite Foren Deutsches LiveCode-Forum Wie zähle ich ein bestimmtes Zeichen in einer Zeile?

Schlagwörter: 

Ansicht von 6 Antwort-Themen
  • Autor
    Beiträge
    • #24410
      Torsten
      Teilnehmer

      Total simple Frage: wie kann ich die Anzahl der Vorkommen eines bestimmten Zeichens in einer Zeile herausfinden, z.B. wieviele Tabs?

      Es geht natürlich über Repeat for each char und dann im Array nahc dem Key suchen, aber gibt es auch noch eine einfachere Möglichkeit?

      Ich benutze sonst den Trick mit number of items, aber wenn ich eine Zeile mit z.B. drei Tabs habe und nach dem letzten Tab kommt kein Zeichen, dann ist das Ergebnis 3. Ist aber danach noch ein Zeichen, ist das Ergebnis 4.

      LG
      Torsten

    • #24412
      Torsten
      Teilnehmer

      Falls nichts kürzeres kommt, ist wie ummer die Lösung: Schreibe Deinen eigenen Handler 🙂

      function charCount pChar, pText
         repeat for each char tChar in pText
            add 1 to tArray[tChar]
         end repeat
         return tArray[pChar]
      end CharCount
      

      charCount(„t“,“anstatt“) –> 3

      Happy Coding
      Torsten

    • #24413
      Torsten
      Teilnehmer

      Falls nichts kürzeres kommt, ist wie immer die Lösung: Schreibe Deinen eigenen Handler 🙂

      function charCount pChar, pText
         repeat for each char tChar in pText
            add 1 to tArray[tChar]
         end repeat
         return tArray[pChar]
      end CharCount
      

      charCount(„t“,“anstatt“) –> 3

      Happy Coding
      Torsten

    • #24414
      Klaus Major
      Verwalter

      So fängt das immer an, Torsten!
      Also mit Selbstgesprächen… 😀

    • #24416
      Torsten
      Teilnehmer

      Ja, Klaus, aber es hilft! Wenn man erstmal die Frage ordentlich fomuliert hat, ist die Antwort manchmal auch schon da 🙂

      Aber zum Thema: was besseres fällt Dir auch nicht ein, oder? Es wäre ja auch schön, wenn es so eine Funktion schon geben würde. Im Prinzip ja etwas umständlich, dass man erst alle Zeichen zählt, nur um eines zu finden. Ok, man kann es auch anders machen:

      function charCount pChar, pText
         repeat for each char tChar in pText
            if pChar = tChar then add 1 to tCounter
         end repeat
         return tCounter
      end CharCount

      Liebe Grüße
      Torsten

    • #24438
      Axwald
      Teilnehmer

      Hallo,

      hätte LC eine Funktion dafür, würde die auch nichts anderes machen ;-))
      Das ist eine Aufgabe, die Computer mögen – das läßt sich prima in Assembler übersetzen, und „duch einen String loopen & Zeichen vergleichen“ dürfte für eine CPU eher entspannend sein.

      Um zu sehen, wie schnell das ist, habe ich einen kleinen Timer geschrieben. In einem Text-Feld habe ich einen einzeiligen Text (ca. 1kB), ich frage nach einem Buchstaben zum suchen, und suche den dann mit verschiedenen Methoden. Jeweils 100x.

      In einem Button:

      on mouseUp
         put line 1 of fld "text_fld" into myData
         put len(mydata) into myLen
         put 100 into myCnt
         
         ask "Was suchst Du?"
         if (it is empty) or (len(it) <> 1) then	
            exit mouseUp
         else
            put it into myChar
         end if
         
         put the millisecs into t1
         repeat myCnt                               --  Torsten 1
            put empty into myArr
            repeat for each char C in myData
               add 1 to myArr[C]
            end repeat
            put myArr[myChar] into myRes1
         end repeat
         
         put the millisecs into t2
         repeat myCnt                               --  Torsten 2
            put empty into myVar2
            repeat for each char C in myData
               if C = myChar then add 1 to myVar2
            end repeat
            put myVar2 into myRes2
         end repeat
         
         put the millisecs into t3
         repeat myCnt                               --  charToNum
            put charToNum(myChar) into myNum3
            put empty into myVar3
            repeat for each char C in myData
               if charToNum(C) = myNum3 then add 1 to myVar3
            end repeat
            put myVar3 into myRes3
         end repeat
         
         put the millisecs into t4
         repeat myCnt                               --  byteToNum
            put byteToNum(myChar) into myNum4
            put empty into myVar4
            repeat for each char C in myData
               if byteToNum(C) = myNum4 then add 1 to myVar4
            end repeat
            put myVar4 into myRes4
         end repeat
         
         put the millisecs into t5	
         
         put "Länge Text gesamt: " & myLen & " / Gesucht: '" & myChar & "' / Version: " & the version & CR & CR & \
      	"Alle im Array; Treffer: " & myRes1 & "; Zeit: " & t2 - t1 & CR & \
               "'C = ...'; Treffer: " & myRes2 & "; Zeit: " & t3 - t2 & CR & \
               "'charToNum(C) = ...'; Treffer: " & myRes3 & "; Zeit: " & t4 - t3 & CR & \
               "'byteToNum(C) = ...'; Treffer: " & myRes4 & "; Zeit: " & t5 - t4 into myMsg
         put myMsg
      end mouseUp

      Ergebnis auf meinem Rechner mit der aktuellen Version:

      Länge Text gesamt: 1016 / Gesucht: 'e' / Version: 9.6.1
      
      Alle im Array; Treffer: 89; Zeit: 63
      'C = ...'; Treffer: 89; Zeit: 120
      'charToNum(C) = ...'; Treffer: 89; Zeit: 86
      'byteToNum(C) = ...'; Treffer: 89; Zeit: 54

      Interessant, oder? Wer hätte gedacht, daß die zweite Version die langsamste wäre? Und daß die erste, wo wir das Vorkommen aller Zeichen zählen, schneller sei?

      Version 1 (alle im Array) ist schnell, weil der Computer nicht vergleichen muß: egal was kommt, er addiert einfach 1 zu dem Wert für dieses Zeichen.

      ‚charToNum‘ und ‚byteToNum‘ sind schnell, weil die Typumwandlung (if byteToNum(C) = myNum4) im Loop vom Compiler wegoptimiert wird – im Gegensatz zu Version 2, wo so eine Typumwandlung (C) erforderlich ist & eingebaut wird: Der Computer sieht Binär-Werte, nicht Buchstaben.

      ‚charToNum‘ war Stand der Technik, bevor Unicode aufkam. Offenbar ist da noch eine Sicherheit eingebaut worden, weswegen es jetzt langsamer als der Nachfolger ‚byteToNum‘ ist. Also ‚byteToNum verwenden!

      Zu Dokumentationszwecken das Ergebnis einer älteren LC Version:

      Länge Text gesamt: 1016 / Gesucht: 'e' / Version: 6.7.10
      
      Alle im Array; Treffer: 89; Zeit: 13
      'C = ...'; Treffer: 89; Zeit: 13
      'charToNum(C) = ...'; Treffer: 89; Zeit: 13
      'byteToNum(C) = ...'; Treffer: 89; Zeit: 12

      Gleicher Rechner, gleiche Daten, gleicher Code.

      Viel Spaß!

    • #24449
      Klaus Major
      Verwalter

      Tja, Torsten, dann gibt es nichts mehr dazu zu sagen! 🙂

Ansicht von 6 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.