Buchstaben Zählen Aufgabe

Bitte aktiviere JavaScript!
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.
 
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)?

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 :)
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^^
 
Zuletzt bearbeitet von einem Moderator:
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)



Java:
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!^^
 
Du hast doch die Bilder gesehen: das "Deckblatt" wandert einfach von links nach rechts.
Code:
 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)
 
Ich habs zwar jetzt, aber glaube in meiner Lösung spiegeln sich nur teilweise deine runtergebrochnenen Überlegungen weiter:
Java:
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
 
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:
Java:
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;
    }
}
 
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?
 
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?
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.
 
@temi hat das natürlich gleich richtig erkannt:
Java:
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
 
@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.
 
Ich glaube er meinte sich selbst damit und nicht Dich... Daher alles gut. (Ansonsten hätte er auch bestimmt mehr erläutert....)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben