# Buchstaben Zählen Aufgabe



## Zrebna (20. Aug 2019)

Hi!

Es geht um folgende zwei Aufgaben:

*Aufgabe 1:*

```
package ex1;

public class CharCounterPresentation {
   

    public static void main(String[] args) {
        String s = "AAAAKKAAB";
               
        char[] array = s.toCharArray();
        // System.out.println(array.length); == 9
       
        for(int i = 0; i < 26; i++) {
            int counter = 0;
            for(int j = 0; j < 9; j++) {
                if(array[j] == i + 'A' || array[j] == i + 'a') {
                    counter++;
                }
            }
            if(counter > 0) {
                System.out.printf("%d%c", counter, i + 'A');
            }
        }    
    }
}
```

Dieses Snipet zählt einfach das Vorkommnis jedes Buchstaben und die Ausgabe ist demnach:
6A1B2K

Nun soll die Aufgabe folgendermaßen abgewandelt werden, so dass folgendes rauskommt:
4A2K2A1B

Es fällt zb. sofort auf, dass die Ausgabe nicht mehr alphabetisch vorgeht, sondern in der Reihenfolge des Strings.
Daher müsste nun der String in der äußeren Schleife sein?

*Erste Gehversuche bzgl. Aufgabe 2:*


```
package ex1;

public class CharCounterPresentation {
   

    public static void main(String[] args) {
        String s = "AAAAKKAAB";
               
        char[] array = s.toCharArray();
        // System.out.println(array.length); == 9
       
        for(int i = 0; i < 9-1; i++) {
            int counter = 0;
            for(int j = 0; j < 26; j++) {
                if(array[i] == array[i+1]) {
                    if(array[i] == j + 'A' || array[i] == j + 'a') {
                        counter++;
                    }
                }
            }
            if(counter > 0) {
                System.out.printf("%d%c", counter, i + 'A');
            }
        }
           
    }
}
```

Da passt also noch gar nichts.
Ich würde genre checken, was da los ist, aber  beim Debugging-Tool funzt nicht mehr - weiß hier Jemand Bescheid, warum es nicht mehr geht:









						Gyazo
					






					gyazo.com
				




Ich versuche in Zeile 6 den Toogle-Breakingpoint zu setzen, aber es funzt nicht, wie gewohnt.
Auf Klick auf das "Käfer"_Symbol kommt es zur Ausgabe, aber es öffnet sich kein Debugging-window, in dem ich wie gewohnt mit "step over" gucken kann, was das Programm step für step macht.

Kann da evtl. Jemand helfen?

Lg,
Zrebna

*Zusatz_OfftopicFrage aus Interesse:*

Wieso kann man eigentlich bei Java bzgl. charr-Arrays nicht innerhalb einer Schleife auf Länge so prüfen, wie bei C mittels (ich weiß nicht notwendig hier, aber hypotetisch interessiert es mich)  :
" for(i = 0; array_ != '\0'; i++)   
                                              ?
Funktionieren char-Arrays in Java speichertechnisch anders und nach dem letztem Buchstaben eines Arrays, folgt nicht '\0'?_


----------



## kneitzel (20. Aug 2019)

Also ich würde Dir erst einmal empfehlen Dir zu überlegen, was denn genau gemacht werden müsste.

Also immer erst sauber ein Design überlegen. Einfach nur umstellen kann in 99% der Fälle eigentlich nur schief gehen - wie Dein Code schon zeigt


----------



## Xyz1 (20. Aug 2019)

break point eine Zeile tiefer



Zrebna hat gesagt.:


> Aufgabe 2


Was genau soll denn in Aufgabe 2 geschehen?



Zrebna hat gesagt.:


> Wieso kann man eigentlich bei Java bzgl. charr-Arrays nicht innerhalb einer Schleife auf Länge so prüfen, wie bei C mittels


Weil es nicht 0-terminiert ist geht das nicht - und zu jedem Array dessen Länge gespeichert wird.


----------



## mihe7 (20. Aug 2019)

Zrebna hat gesagt.:


> Wieso kann man eigentlich bei Java bzgl. charr-Arrays nicht innerhalb einer Schleife auf Länge so prüfen, wie bei C mittels (ich weiß nicht notwendig hier, aber hypotetisch interessiert es mich) :


Natürlich kannst Du das:

```
for (int i = 0; i < arr.length; i++) {
}
```
Oder, wenn Du es lieber C-Style haben willst:

```
char[] arr = "MeinString\0".toCharArray();
for (int i = 0; arr[i] != '\0'; i++) {
}
```


----------



## Zrebna (21. Aug 2019)

Alles klar!
Danke schon mal an alle - ich nehme mich der Aufgabe nochmal bald an und versuche es nochmal, incl. euerer Tips.

Nochmal bzgl. Debugging-Problem:
Keiner eine Idee, warum das bei mir nicht mehr geht? Hat anfänglich immer ohne Probleme funktioniert...wäre schon gut, wenn das wieder gehen würde, weil ich diese Funktion fürs Verständnis oftmals sehr hilfreich fand.


----------



## Zrebna (21. Aug 2019)

Tobias-nrw hat gesagt.:


> break point eine Zeile tiefer


breakpoint eine Zeile tiefer geht auch nichts:








						Gyazo
					






					gyazo.com
				






Tobias-nrw hat gesagt.:


> Was genau soll denn in Aufgabe 2 geschehen?


Steht im OP - Ausgabe soll sein:
4A2K2A1B  - ist klar, was gemacht werden soll?



Tobias-nrw hat gesagt.:


> Weil es nicht 0-terminiert ist geht das nicht - und zu jedem Array dessen Länge gespeichert wird.


Alles klar, danke.


----------



## Zrebna (21. Aug 2019)

mihe7 hat gesagt.:


> Natürlich kannst Du das:
> 
> ```
> for (int i = 0; i < arr.length; i++) {
> ...




also gehts doch - dann doch 0-terminiert, wie bei C oder nicht (siehe Vorposter)?


----------



## kneitzel (21. Aug 2019)

Also 0 terminiert ist ein String in Java normalerweise nicht. Du kannst maximal ein 0 Zeichen einfügen. Wenn Du Das Beispiel von mihe genau betrachtest, dann hat er an den String noch ein \0 angehängt: `"MeinString\0"`

Aber das brauchst Du nicht in Java, denn so ein Char-Array hat eine bestimmte Größe und die nutzt Du einfach um durch die Zeichenkette zu gehen. Alles andere sind "Hacks", die man so nicht braucht und die auch eher zu Fehlern / schwer verständlichem Code führen.


----------



## mihe7 (21. Aug 2019)

Zrebna hat gesagt.:


> also gehts doch - dann doch 0-terminiert, wie bei C oder nicht (siehe Vorposter)?


Es geht, wenn Du den String 0-terminierst (was in Java normal nicht der Fall ist). Siehe Antwort von @kneitzel - der mir gerade eben zuvorgekommen ist


----------



## kneitzel (21. Aug 2019)

Evtl. sollte man auch darauf hinweisen, dass \0 auch ein Zeichen ist. Die Nutzung als Terminator ist damit auch durchaus nicht unproblematisch. Daher wäre so ein Hack auch ein klarer Schritt in die falsche Richtung (Auch wenn es wohl unwahrscheinlich ist, dass diese Problematik auftritt. Aber die reine Existenz dieser Problematik hat z.B. dazu geführt, dass es für dieses NUL Zeichen in modified UTF noch eine zweite Representation gibt: 0xC0 0x80, damit die, die sowas evtl. brauchen, diese Problematik umgehen konnten...

Aber was schreibe ich - findet sich ja auch alles ausführlich auf Wikipedia: https://en.wikipedia.org/wiki/Null_character


----------



## Xyz1 (21. Aug 2019)

Ich überleg gerad, ob es nur Konvention in C ist, dass jedes char * das Nullzeichen zum Schluss enthält, oder das auch durch den Compiler sichergestellt ist...

Jedenfalls kommt man damit in Teufels Küche wie es @kneitzel schon richtig anmerkte. Wäre nicht verwunderlich, wenn dann irgendetwas abstürzte oder in die Luft flög.


----------



## mrBrown (21. Aug 2019)

Tobias-nrw hat gesagt.:


> Ich überleg gerad, ob es nur Konvention in C ist, dass jedes char * das Nullzeichen zum Schluss enthält, oder das auch durch den Compiler sichergestellt ist...


Bei String-Literalen müsste der Compiler immer die \0 anhängen, bei allem anderen musst du dich selbst drum kümmern.


----------



## mihe7 (21. Aug 2019)

Zrebna hat gesagt.:


> Nun soll die Aufgabe folgendermaßen abgewandelt werden, so dass folgendes rauskommt:
> 4A2K2A1B


Nimm mal zwei Blätter Papier. Auf das eine schreibst Du AAAAKKAB. Mit dem anderen verdeckst Du jetzt die Zeichenkette, bis auf den ersten Buchstaben. Jetzt überlegst Du Dir, welche ganz kleinen Schritte Du tun musst, um die Anzahl des ersten Buchstabens (hier: A) zu ermitteln.



Welche Aussagen kannst Du bzgl. des Buchstabens, der Anzahl etc. treffen? Beispielsweise: wann kannst Du mit Sicherheit sagen, dass es sich um 4 As handelt?


----------



## Zrebna (22. Aug 2019)

kneitzel hat gesagt.:


> Also 0 terminiert ist ein String in Java normalerweise nicht. Du kannst maximal ein 0 Zeichen einfügen. Wenn Du Das Beispiel von mihe genau betrachtest, dann hat er an den String noch ein \0 angehängt: `"MeinString\0"`
> 
> Aber das brauchst Du nicht in Java, denn so ein Char-Array hat eine bestimmte Größe und die nutzt Du einfach um durch die Zeichenkette zu gehen.
> *Diese Größe findet man eben mit der .length-Methode rauß?*
> Alles andere sind "Hacks", die man so nicht braucht und die auch eher zu Fehlern / schwer verständlichem Code führen.



Ach so, das hab ich in der Tat übersehn - ja, dass es konfiguriert klappt ist sogar mir Noob klar xD
Aber ok, also als Default sind Strings in Java nicht 0-terminiert und die Länge wird mit der .length-Methode ermittelt - gut zu wissen^^


----------



## Zrebna (22. Aug 2019)

@all:
Nochmal wegen dem Debugger - Niemand eine Idee, warum der nicht mehr funzt und was ich da machen könnte?
Vermisse dieses Tool
Notfalls eclipse reinstallieren - aber würde schon gerne wissen, warum es plötzlich nicht mehr funzt, damit es nicht nochmal passiert...

edit: Evtl. nicht der beste Forenbereich für diese Frage?


----------



## kneitzel (22. Aug 2019)

Hast Du unter Run evtl. Skip all breakpoints aktiviert (bzw. hast die entsprechende Tastenkombination gedrückt)?

Einfach erneut auswählen und schon sind die Breakpoints wieder aktiv - so es das war, aber danach sieht es aus, denn dann sind die Breakpoint Symbole einfach so durchgestrichen wie in Deinem Bildschirmfoto.


----------



## Zrebna (22. Aug 2019)

mihe7 hat gesagt.:


> Nimm mal zwei Blätter Papier. Auf das eine schreibst Du AAAAKKAB. Mit dem anderen verdeckst Du jetzt die Zeichenkette, bis auf den ersten Buchstaben. Jetzt überlegst Du Dir, welche ganz kleinen Schritte Du tun musst, um die Anzahl des ersten Buchstabens (hier: A) zu ermitteln.
> 
> Anhang anzeigen 12338
> 
> Welche Aussagen kannst Du bzgl. des Buchstabens, der Anzahl etc. treffen? Beispielsweise: wann kannst Du mit Sicherheit sagen, dass es sich um 4 As handelt?



Also wie ich die Anzahl der ersten 4 As ermittle  würde ich noch hinbekommen:


```
for(int i = 0; i < 26; i++) {
            int counter = 0;
            for(int j = 0; j < 9; j++) {
                if(array[j] == i + 'A' || array[j] == i + 'a') {
                    counter++;
                }
            }
            if(counter > 0) {
                System.out.printf("%d%c", counter, i + 'A');
            }
        }
```
*Ausgabe: *
6A1B2K

*In Worten für Lerneffekt und damit ihr meine Überlegungen nachvollziehen könnt und notfalls korrigieren könnt:*
In der äußeren Schleife wird effektiv auf dem Alphabet jeder einzelne Buchstabe genommen und auf den gesamten String angewendet (innere Schleife) - dort wird nun überprüft, ob der gegenwärtig entnommene Buchstabe mit dem Buchstaben an Position 'j' übereinstimmt - falls ja, wird der Zähler erhöht.
Falls der Zähler nach der inneren Schleife >0 ist (d.h. Buchstabe kommt im String mind. einmal vor), wird Anzahl und Buchstabe geprintet.

*Meine Probleme mit der neuen Aufgabenstellung sind nun:*
1.) Nun soll ja die Ausgabe nicht alphabetisch erfolgen, sondern in der Reihenfolge des Strings.
Daher müsste nun der String in der äußeren Schleife sein?

2.) Desweiteren soll das Zählen nur so lange gehen, wie String(Position) == String(Position+1) ist - also solange nach dem gegenwärtigem Buchstaben der nächste der selbe ist  - jedoch soll die letzte Runde auch noch mitgezählt werden, sonst wären es ja 3 As und nicht 4 As im erstem Teilbereich.

Soweit scheint es nicht hinzuhauen:


```
package ex1;

public class CharCounterPresentation {
   

    public static void main(String[] args) {
        String s = "AAAAKKAAB";
               
        char[] array = s.toCharArray();
        // System.out.println(array.length); == 9
       
        for(int i = 0; i < 9-1; i++) {
            int counter = 0;
            if(array[i] == array[i+1]) {
            for(int j = 0; j < 26; j++) {
                if(array[i] == j + 'A' || array[i] == j + 'a') {
                    counter++;
                }
            }
            if(counter > 0) {
                System.out.printf("%d%c", counter, i + 'A');
            }
            }
           
        }
           
    }
}
```

Mir ist klar, warum mein Code nicht funktioniert - ich muss grad dringend "weg" - gucke mir mirgen alles nochmal in Ruhe an - Danke soweit


----------



## Zrebna (22. Aug 2019)

kneitzel hat gesagt.:


> Hast Du unter Run evtl. Skip all breakpoints aktiviert (bzw. hast die entsprechende Tastenkombination gedrückt)?
> 
> Einfach erneut auswählen und schon sind die Breakpoints wieder aktiv - so es das war, aber danach sieht es aus, denn dann sind die Breakpoint Symbole einfach so durchgestrichen wie in Deinem Bildschirmfoto.



Ah, vielen Dank, das wars ^^ - was für ne Erleichterung


----------



## mihe7 (22. Aug 2019)

Zrebna hat gesagt.:


> Also wie ich die Anzahl der ersten 4 As ermittle würde ich noch hinbekommen:


Vergiss den Code. Du sollst einfach überlegen, was Du mit dem Blatt Papier machen musst, wann Du zählst, was Du zählst und wann Du mit Sicherheit eine Aussage über die Anzahl aufeinanderfolgender Buchstaben treffen kannst.


----------



## mihe7 (22. Aug 2019)

Um das abzukürzen und nachdem eigentlich eh schon alles dasteht, helfe ich Dir mal direkt:

Vorab hast Du noch gar keinen Buchstaben und dem entsprechend eine Anzahl von 0. Jetzt fängt der Spaß an: Du schaust auf das Blatt und siehst ein A (1. Bild). Damit erhöht sich die Anzahl um 1, außerdem kennst Du damit auch den Buchstaben. Du weißt also, dass der Buchstabe einmal vorkommt. Du kannst aber noch nicht sagen, ob auf diesen Buchstaben nochmal der gleiche folgt. 

Das weißt Du erst, wenn es entweder keinen Folgebuchstaben gibt oder sich der Folgebuchstabe vom aktuellen unterscheidet (an der Stelle geht es nicht darum, zu wissen, um welchen Folgebuchstaben es sich handelt, sondern nur darum, dass es ein anderer ist). 

Ist der Folgebuchstabe der gleiche, kannst Du einfach weiter machen: der Folgebuchstabe wird zum aktuellen, Du zählst eins hoch, die Anzahl ist 2 (Bild 2). Das gleiche für Bild 3 und 4.

Nachdem Du also 4 As gezählt hast, stellst Du fest, dass es zwar einen Folgebuchstaben gibt, dieser aber sich von einem A unterscheidet. An dem Punkt kannst Du mit Sicherheit sagen, dass es 4 aufeinanderfolgende As sind. Zu diesem Zeitpunkt kennst Du aber den Folgebuchstaben noch nicht, so dass die Anzahl wieder auf 0 gesetzt wird und das Spiel beginnt von vorne.

Der Code enthält weniger Zeichen als die Erklärung


----------



## Zrebna (23. Aug 2019)

mihe7 hat gesagt.:


> Vergiss den Code. Du sollst einfach überlegen, was Du mit dem Blatt Papier machen musst, wann Du zählst, was Du zählst und wann Du mit Sicherheit eine Aussage über die Anzahl aufeinanderfolgender Buchstaben treffen kannst.



Hey, bevor ich mir deine nächste Message angucke, erstmal noch hierzu, weil ich diese konzeputuelle Übung gut finde und mich genau sowas evtl. generell weiterbringen könnte:

Also gesprochen würde ich die Vorgehensweise so beschreiben:
Ich beginne mit dem Zählen *nachdem *ich den ersten Buchstaben gelesen habe (gehe von links nach rechts).
Ich höre mit dem Zählen auf, sobald ein anderer Buchstabe erscheint.
Die bis dato ermittelte Anzahl ist die Anzahl des gerade gezählten Buchstabens, und zwar bevor ein anderer Buchstabe erschienen ist - d.h. nur direkt aufeinanderfolgende gleiche Buchstaben werden pro Zählung gezählt.


----------



## Zrebna (23. Aug 2019)

mihe7 hat gesagt.:


> Um das abzukürzen und nachdem eigentlich eh schon alles dasteht, helfe ich Dir mal direkt:
> 
> Vorab hast Du noch gar keinen Buchstaben und dem entsprechend eine Anzahl von 0. Jetzt fängt der Spaß an: Du schaust auf das Blatt und siehst ein A (1. Bild). Damit erhöht sich die Anzahl um 1, außerdem kennst Du damit auch den Buchstaben. Du weißt also, dass der Buchstabe einmal vorkommt. Du kannst aber noch nicht sagen, ob auf diesen Buchstaben nochmal der gleiche folgt.



Code-technisch müsste man daher in der äußeren Schleife auf jeden Fall das array betrachten, weil wir ja damit beginnen, dass wir eben von links nach rechts jedes Zeichen das Arrays betrachten.
Danach wird wohl counter direkt erhöht und das geht so lange, bis gegenwärtiger Buchstabe != folgender Buchstabe (also anderer Buchstabe oder Ende des Strings)?



mihe7 hat gesagt.:


> Das weißt Du erst, wenn es entweder keinen Folgebuchstaben gibt oder sich der Folgebuchstabe vom aktuellen unterscheidet (an der Stelle geht es nicht darum, zu wissen, um welchen Folgebuchstaben es sich handelt, sondern nur darum, dass es ein anderer ist).
> 
> Ist der Folgebuchstabe der gleiche, kannst Du einfach weiter machen: der Folgebuchstabe wird zum aktuellen, Du zählst eins hoch, die Anzahl ist 2 (Bild 2). Das gleiche für Bild 3 und 4.
> 
> ...



Hab grad versucht es zu coden, aber haut noch nicht ganz hin.
Muss für Heute weg....morgen gehts dann weiter - Danke schon mal soweit^^


----------



## mihe7 (23. Aug 2019)

Zrebna hat gesagt.:


> Code-technisch müsste man daher in der äußeren Schleife


Es gibt nur eine Schleife...


----------



## Zrebna (23. Aug 2019)

mihe7 hat gesagt.:


> Es gibt nur eine Schleife...



Ah ok, dann ist wohl dieser Ansatz bzgl. deinen Lösungsüberlegungen komplett daneben?
(Ausgabe noch nicht exakt, das was ich will mit 4A1K1A1A1B, aber näher dran, als zuvor xD)




```
package ex1;

public class CharCounterPresentation {
    

    public static void main(String[] args) {
        String s = "AAAAKKAAB";
                
        char[] array = s.toCharArray();
        // System.out.println(array.length); == 9
        
        int i = 0;
        int j, counter;
        
        for( ; i < array.length; i++) {
            counter = 1;
            for(j = i; j < (array.length-i); j++) {
                if(array[i] != array[j+1]) {
                    i = j+1;
                    break;
                }
                counter++;   
            }
            System.out.printf("%d%c", counter, array[j]);       
        }       
    }         
}
```

Heute raucht bereits der Kopf... - ich versuche es morgen erneut mit deinem Hinweis, dass nur eine Schleife reicht und überlege dann dahingehend nochmals

Schon mal Danke soweit!^^


----------



## mihe7 (23. Aug 2019)

Du hast doch die Bilder gesehen: das "Deckblatt" wandert einfach von links nach rechts.

```
AAAAKKBA
^ vor Beginn: kein Buchstabe bekannt; anzahl := 0

 AAAAKKBA
 ^ aktueller Buchstabe := A, Anzahl erhöhen (anzahl = 1)
   Nächster Buchstabe? Existiert ist gleich dem aktuellen, also weiter

 AAAAKKBA
  ^ aktueller Buchstabe := A, Anzahl erhöhen (anzahl = 2)
    Nächster Buchstabe? Existiert ist gleich dem aktuellen, also weiter
 AAAAKKBA
   ^ aktueller Buchstabe := A, Anzahl erhöhen (anzahl = 3)
     Nächster Buchstabe? Existiert ist gleich dem aktuellen, also weiter
 AAAAKKBA
    ^ aktueller Buchstabe := A, Anzahl erhöhen (anzahl = 4)
      Nächster Buchstabe? Existiert ist nicht gleich dem aktuellen, also:
      anzahl + aktuellen Buchstaben ausgeben (4A)
      anzahl auf 0 zurücksetzen und weiter
 AAAAKKBA
     ^ aktueller Buchstabe := K, Anzahl erhöhen (anzahl = 1)
     Nächster Buchstabe? Existiert ist gleich dem aktuellen, also weiter
 AAAAKKBA
      ^ aktueller Buchstabe := K, Anzahl erhöhen (anzahl = 2)
        Nächster Buchstabe? Existiert ist nicht gleich dem aktuellen, also:
        anzahl + aktuellen Buchstaben ausgeben (2K)
        anzahl auf 0 zurücksetzen und weiter
 AAAAKKBA
       ^ aktueller Buchstabe := B, Anzahl erhöhen (anzahl = 1)
         Nächster Buchstabe? Existiert ist nicht gleich dem aktuellen, also:
         anzahl + aktuellen Buchstaben ausgeben (1B)
         anzahl auf 0 zurücksetzen und weiter
 AAAAKKBA
        ^ aktueller Buchstabe := A, Anzahl erhöhen (anzahl = 1)
          Nächster Buchstabe? Existiert nicht, also:
          anzahl + aktuellen Buchstaben ausgeben (1A)
          anzahl auf 0 zurücksetzen und weiter (=> Schleife endet)
```


----------



## Zrebna (24. Aug 2019)

Ich habs zwar jetzt, aber glaube in meiner Lösung spiegeln sich nur teilweise deine runtergebrochnenen Überlegungen weiter:

```
package ex1;

public class CharCounterPresentation {
    

    public static void main(String[] args) {
        String s = "AAAAKKAAB";
                
        char[] array = s.toCharArray();
        // System.out.println(array.length); == 9
        
        int i;
        int counter = 1;
        
        for(i = 0 ; i < array.length-1; i++) { 
            if(array[i] != array[i+1]) {
                System.out.printf("%d%c", counter, array[i]);
                counter = 1;
                continue;
            }
            counter++;
        }
        System.out.printf("%d%c\n", counter, array[i]);
    }         
}
```

Wie hättest du es gelöst?

Lg,
Zrebna


----------



## mihe7 (24. Aug 2019)

Zrebna hat gesagt.:


> Wie hättest du es gelöst?


Dein Ansatz ist grundsätzlich schon ok. Wenn Du nicht im Voraus zählst, dann kannst Du die doppelte Ausgabe einsparen:

```
int counter = 0; // vorab nix bekannt
for (int i = 0; i < array.length; i++) {
    char ch = array[i];
    counter++;
    if ((i+1) == array.length || array[i+1] != ch) { // Ausgabe muss erfolgen, wenn
                                                     // letztes Zeichen erreicht ist oder
                                                     // ein anderes Zeichen folgt
        System.out.printf("%d%c", counter, ch);
        counter = 0;
    }
}
```


----------



## Blender3D (25. Aug 2019)

mihe7 hat gesagt.:


> ```
> if ((i+1) == array.length || array[i+1] != ch) { // Ausgabe muss erfolgen, wenn
> // letztes Zeichen erreicht ist oder
> // ein anderes Zeichen folgt
> ...


So einfach ist es in diesem Fall aber nicht. 
AAAAKKBA
--> 4A2K1B1A


----------



## mihe7 (25. Aug 2019)

@Blender3D Was meinst Du?


----------



## Zrebna (25. Aug 2019)

Ah ok, so hast du das gelöst - nice^^

@OpenJDK:
?

Generell:
Was ich nicht verstehe ist, warum ich eine exception bei meinem Codesnippet erhalte, wenn ich die Abbruchbedingung bei der
for-Schleife nicht mit 'i < array.length-1' versehe, wie getan, sondern mit 'i < array.length' ?

Ich beginne den Index bei 0 und mein Array hat neun Zeichen.
Da sollte doch <Länge körrekt sein weil 0 bis <9 entspricht 0 bis 8, was 9 Iterationen sind - also die Anzahl der Elemente im array.
Wieso funktioniert es nur wenn ich 8 mal iterieren lasse?


----------



## Blender3D (25. Aug 2019)

mihe7 hat gesagt.:


> Was meinst Du?


Die Ausgabe des obigen Codes wäre hier bei "AAAAKKBA ".
"4A2K1B1A"
es wird aber 
5A2K1B erwartet.
Das Zählen kann nicht aufhören, wenn ein anderes Zeichen gefunden wurde. Es muss der ganze String nach dem Vorkommen des gewählten Zeichens durchsucht werden.


----------



## mrBrown (25. Aug 2019)

Blender3D hat gesagt.:


> Die Ausgabe des obigen Codes wäre hier bei "AAAAKKBA ".
> "4A2K1B1A"
> es wird aber
> 5A2K1B erwartet.
> Das Zählen kann nicht aufhören, wenn ein anderes Zeichen gefunden wurde. Es muss der ganze String nach dem Vorkommen des gewählten Zeichens durchsucht werden.





Zrebna hat gesagt.:


> Nun soll die Aufgabe folgendermaßen abgewandelt werden, so dass folgendes rauskommt:
> 4A2K2A1B


----------



## temi (25. Aug 2019)

Zrebna hat gesagt.:


> Was ich nicht verstehe ist, warum ich eine exception bei meinem Codesnippet erhalte, wenn ich die Abbruchbedingung bei der
> for-Schleife nicht mit 'i < array.length-1' versehe, wie getan, sondern mit 'i < array.length' ?
> 
> Ich beginne den Index bei 0 und mein Array hat neun Zeichen.
> ...



Vermutlich greifst du in deinem Code irgendwo auf das i+1te Element zu und das liegt dann für i=8 außerhalb des Arrays.


----------



## mihe7 (25. Aug 2019)

@temi hat das natürlich gleich richtig erkannt:

```
for(i = 0 ; i < array.length-1; i++) { 
            if(array[i] != array[i+1]) {
```
Für i == 8 gilt array[i+1] == array[9] -> Exception


----------



## Blender3D (25. Aug 2019)

Blender3D hat gesagt.:


> es wird aber
> 5A2K1B erwartet.





Zrebna hat gesagt.:


> Nun soll die Aufgabe folgendermaßen abgewandelt werden, so dass folgendes rauskommt:
> 4A2K2A1B


@mrBrown Das zeigt mir wieder einmal: *Immer genau lesen*.


----------



## mrBrown (25. Aug 2019)

Blender3D hat gesagt.:


> @mrBrown Das zeigt mir wieder einmal: *Immer genau lesen*.


Wo les ich denn was falsch?


OP sagt im Eingangspost, dass bei „AAAAKKAAB“ „4A2K2A1B“ rauskommen soll, aktuell aber „6A1B2K“ rauskommt - es sollen also nicht einfach alle Vorkommen gezählt werden, sondern nur aufeinanderfolgende Vorkommen, darauf bezog sich mein Zitat.
Für das von dir genannte „AAAAKKBA“ sollte also „4A2K1B1A“ rauskommen.

Du sagst in deinem Post genau das Gegenteil; dass nicht aufeinanderfolgende, sondern alle gezählt werden sollen - für „AAAAKKBA“ soll laut dir also „5A2K1B“ rauskommen.
Aber genau das macht ja schon der Code im Eröffnungspost.


----------



## kneitzel (25. Aug 2019)

Ich glaube er meinte sich selbst damit und nicht Dich... Daher alles gut. (Ansonsten hätte er auch bestimmt mehr erläutert....)


----------



## Blender3D (26. Aug 2019)

mrBrown hat gesagt.:


> Wo les ich denn was falsch?


Nicht Du ich meinte mich. Ich habe ja den Widerspruch gepostet.
Aber ich bin wohl nicht der einzige der nicht genau liest.


----------



## Zrebna (26. Aug 2019)

mihe7 hat gesagt.:


> @temi hat das natürlich gleich richtig erkannt:
> 
> ```
> for(i = 0 ; i < array.length-1; i++) {
> ...



Ah lol@myself - ja, stimmt   - "vor lauter Bäumen, usw..." xD 
Danke fürs Aufzeigen


----------

