String zeichen Zählen

#1
Hallo ich hab ein projekt bei dem ich stellen und anzahl eines projektes zählen muss, ich weiss zwar wie man wenn man zeichen in einem string zählt aber gibt es auch eine funktion mit der man die anzahl der zeichen und auch die stelle wissen könnte also hier in diesem Beispiel zum beispiel das es zwei 2en gibt und die an den stellen 0 und 2 sind
Code:
var string = "202342"
 

alinnert

Well-Known Member
#2
Das ist tatsächlich gar nicht so trivial. Es gibt die Methode indexOf() bei Strings.

Javascript:
var myString = '202342'
var index = myString.indexOf('2')
Diese liefert aber nur das erste Vorkommen zurück. In dem Falle also 0. Wenn der Substring nicht gefunden wird, kommt -1 zurück.

Du kannst als 2. Parameter angeben, ab welchem Index er anfangen soll zu suchen.

Javascript:
var myString = '202342'
var index = myString.indexOf('2', 1)
Das liefert dann 2 zurück.

Du müsstest also solange den Index suchen und da weitermachen, wo du aufgehört hast zu suchen, bis das Zeichen nicht mehr gefunden werden kann (-1).

Reicht dir das als Gedankenanstoß?
 

Sempervivum

Well-Known Member
c-b Experte
#3
Ich würde eher vorschlagen, anders herum vorzugehen und den String einmal abzusuchen. Dann ein Objekt mit Zeichen als Schlüssel führen und dort die Zeichen zählen.
 

Sempervivum

Well-Known Member
c-b Experte
#4
Ich würde eher vorschlagen, anders herum vorzugehen und den String einmal abzusuchen. Dann ein Objekt mit Zeichen als Schlüssel führen und dort für jedes Zeichen die Anzahl und die Positionen führen.
uups, da habe ich neu gepostet, anstatt zu ändern!
 

Sempervivum

Well-Known Member
c-b Experte
#6
Ja, dann braucht man keine Liste der möglichen Zeichen und zählt nur die, die auch drin sind. Und man braucht nur eine Iteration.
 
Zuletzt bearbeitet:

Sempervivum

Well-Known Member
c-b Experte
#8
Die Aufgabe liest sich einfach, aber Du musst schon relativ viel wissen, um sie zu lösen, vor allem, um das Ergebnis sinnvoll abzulegen: for-Schleifen, Objekte und Arrays.
Die Lösung könnte dann so aussehen:
Code:
        const teststr = 'niohowhnwrm',
            result = {}; // leeres Objekt für das Ergebnis anlegen
        // alle Zeichen des Strings bearbeiten:
        for (let idx = 0; idx < teststr.length; idx++) {
            // das aktuelle Zeichen:
            const item = teststr[idx];
            // pruefen, ob das aktuelle Zeichen noch nicht im Ergebnis 
            // vorhanden ist:
            if (!result[item]) {
                // noch nicht vorhanden: Neuen Datensatz erzeugen
                // die Anzahl ist 1 und die Positionen ein Array mit
                // einem einzigen Element: Die aktuelle Position
                result[item] = { number: 1, positions: [idx] };
            } else {
                // vorhanden: Anzahl um eins erhoehen,
                // Position dem Array hinzu fuegen
                result[item].number++;
                result[item].positions.push(idx);
            }
        }
        // String und Ergebnis in der Console ausgeben:
        console.log(teststr);
        console.log(result);
 

dominikb

Well-Known Member
c-b Experte
#10
Javascript:
const s = "Cappuccino"
let r = {}

for (let i = 0; i < s.length; r[s[i]] = r[s[i]]||{n: 0, idx: []}, r[s[i]].n++, r[s[i]].idx.push(i), i++)
Wer bietet was Kürzeres?
 

asc

Well-Known Member
c-b Experte
#11
Javascript:
const s = "Cappucino";
const r = s.split('').reduce((r,v,i) => (((r[v] || (r[v] = {n: 0, idx: []})).n++, r[v]).idx.push(i), r), {});
 

asc

Well-Known Member
c-b Experte
#13
Es fehlt die Liste mit Positionen wo die Buchstaben im string stehen ;)

Javascript:
let s = new String('Cappuccino');
for(let c,i=0;i<s.length;++i)((s[c=s[i]]||(s[c]={n:0,i:[]})).n++,s[c]).i.push(i);
 
Zuletzt bearbeitet:

alinnert

Well-Known Member
#16
Hm, meine Variante hat nur den Nachteil, dass die Indizes als String gespeichert werden. Zählt das dann? Man kann die Indizes beim Auslesen ja immer noch in parseInt() hauen. :D
 

asc

Well-Known Member
c-b Experte
#18
In JavaScript kannst du überall geklammerte Listen nutzen (1,2,3,4) und erhältst als Ergebnis des Ausdrucks das letzte Element der Liste.
((initialisierung von s[c]).n++, s[c]) liefert in diesem Fall dann einfach s[c] zurück :)

Findet man oft wenn man UglifyJS/Terser Code anschaut anschauen muss.

Letzter Versuch:
Javascript:
let s = Object('Cappuccino');
{let c,i;for(i in s)((s[c=s[i]]||(s[c]={n:0,i:[]})).n++,s[c]).i.push(+i);}
 
Zuletzt bearbeitet:

alinnert

Well-Known Member
#20
Naja, JavaScript hat einige Features, die man nicht wirklich kennen muss - außer vielleicht man schreibt einen something-to-JS-transpiler: Hier der Komma-Operator, Code-Blöcke mit { ... } und Labels + goto. Kann man alles auch einfach ignorieren :D
 
Oben