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
            Administrator

              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
                  Administrator

                    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.