Startseite › Foren › Deutsches LiveCode-Forum › Wie zähle ich ein bestimmtes Zeichen in einer Zeile?
Schlagwörter: number characters
- Dieses Thema hat 6 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahren von Klaus Major.
-
AutorBeiträge
-
-
November 16, 2020 um 20:20 Uhr #24410
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 -
November 16, 2020 um 20:37 Uhr #24412
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 -
November 16, 2020 um 20:38 Uhr #24413
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 -
November 16, 2020 um 22:34 Uhr #24414
So fängt das immer an, Torsten!
Also mit Selbstgesprächen… 😀 -
November 16, 2020 um 23:59 Uhr #24416
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 -
November 17, 2020 um 13:57 Uhr #24438
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ß!
-
November 17, 2020 um 15:26 Uhr #24449
Tja, Torsten, dann gibt es nichts mehr dazu zu sagen! 🙂
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.