Buchstaben aus String einzeln Zählen

j0k3r87

Mitglied
Hallo liebe Community,

ich habe ein Programm geschrieben, welches mir einen String, das es über die Konsole eingegeben bekommt, kompilieren soll. So soll z.B. aus

zzzzgggaakkkkkkkklll später z4g3aak8l3 werden. Sobald also ein Buchstabe mehr als zweimal hintereinander vorkommt soll nur der Buchstabe und dnanch die Häufigkeit ausgegeben werden. Soweit bin ich bisher:

Code:
class Zeichen{
     public static void main(String[] args){
    	 int i = 0;
    	 String a = args[i];
    	 int counter = 1;
    	 System.out.print(a.charAt(0));
    	 for(int c = 1 ; c < a.length (); c++){
    		
    		 	if(a.charAt(c) == a.charAt(c-1) && c > 3)
    		 	{
    		 		counter++;
    		 		
    		 	}
    		 	else 
    		 	{
    		 		counter = 1;
    		 	}
    		 	
    		 	System.out.print(a.charAt(c) +""+ counter +" ");    		 	
    	 	} 
     	}	 
}

Allerdings bekomme ich dort folgende Ausgabe:

zz1 z1 z1 g1 g2 g3 a1 a2 k1 k2 k3 k4 k5 k6 k7 k8 l1 l2 l3

Hoffe ihr könnt mir helfen.
 
Du darfst die Ausgabe sicherlich erst im else-Case machen, da du erst nach einem nächsten Zeichen weisst, ob es das gleiche ist, oder nicht. Problematisch wirds natürlich auch für die letzten Zeichen im String, da dort ggf nie der else-Zweig durchlaufen wird.
 
Ja Wahrscheinlich, aber in letzter Zeit sind hier ja fast nur noch Hausaufgaben ;-)

Für was ist das gut
Code:
&& c > 3
? das sorgt für dein zz am anfang, dann wie schon von faetzminator geschrieben ;-)
 
ihr habt recht, das c > 3 war sinnlos, habe es entfernt ;-) . allerdings verändert dies nichts an meiner ausgabe. und wenn ich die ausgabe im else case mache bekomme ich folgendes : zg1 a1 k1 l1
 
du hast da wahrscheinlich jetzt stehen
Java:
else {
  counter = 1;
  System.out.print(a.charAt(c) +""+ counter +" ");
}
was dafür sorgt, das du den neuen buchstaben (deswegen als erstes das g mit dem resetteten counter ausgibst, deswegen 1, mach mal
Java:
else {
  System.out.print(a.charAt(c-1) +""+ counter +" ");
  counter = 1;
}
 
alle syso ausgaben dürften doch erst nach der schleife kommen und das Ergbnis präsentieren
 
Stimmt, diese Ausgabe ist Sinnlos
Java:
System.out.print(a.charAt(0));
 
vielen dank erstmal für eure hilfe 🙂. es funktioniert soweit, nur das noch der counter nach jeder zahl ausgegeben wird. allerdings soll es ja so zum ende aussehen:

z4g3aak8l3
 
vielen dank erstmal für eure hilfe 🙂. es funktioniert soweit, nur das noch der counter nach jeder zahl ausgegeben wird. allerdings soll es ja so zum ende aussehen:

z4g3aak8l3

wie gesagt, ausgabe nach der schleife oder wenn ein neuer buchstabe kommt den alten ausgeben


uh umständlich.


hier mal ne lösung, null lerneffekt aber gratis einsen für alle 🙂
Java:
    public static void main(String[] args) {
        shortenString("rrrruuuunnnllllleeeeeenggttttthhhhhhhhhencodiiiiiinggggg");
    }


    private static void shortenString(String string) {
        char[] chars = string.toCharArray();
        StringBuilder result = new StringBuilder();
        int equalCharCounter = 1;

        for (int i = 1; i < chars.length; i++) {
            if (chars[i-1] == chars[i]) {
                equalCharCounter++;
            }
            else {
                addChar(i, equalCharCounter, chars, result);
                equalCharCounter = 1;
            }
        }

        addChar(chars.length, equalCharCounter, chars, result);
        System.out.println("shortened: " + result.toString());
    }


    private static void addChar(int index, int count, char[] chars, StringBuilder result) {
        result.append(chars[index-1]);

        if (count == 2) {
            result.append(chars[index-1]);
        }
        else if (count > 2){
            result.append(count);
        }
    }
 
Wie gesagt, die Ausgabe in den Else Teil, das ist wenn ein neuer Buchstabe kommt, dann müsste die Ausgabe genau so aussehen
Code:
z4g3aak8l3
 
Nochmal eine angepasste Version, die die Anforderung vom OP erfüllt. Hoffe ich 🙂

Java:
public static void main(String[] args) throws ParseException
	{
		int i = 0;
		String a = args[i];
	   	int counter = 1;
	   	for(int c = 1 ; c < a.length (); c++)
	   	{
	   		if(a.charAt(c) == a.charAt(c-1))
		 	{
		 		counter++;
		 	}
		 	else 
		 	{
		 		if(counter > 2)
		 			System.out.print(a.charAt(c-1) +""+ counter);
		 		else if(counter == 2)
		 			System.out.print(a.charAt(c-1)+""+a.charAt(c-1));
		 		else
		 			System.out.print(a.charAt(c-1));
		 		counter = 1;
		 	}
	   		
	   		if(c == a.length()-1)
	   		{
	   			if(counter > 2)
		 			System.out.print(a.charAt(c) +""+ counter);
		 		else if(counter == 2)
		 			System.out.print(a.charAt(c)+""+a.charAt(c));
		 		else
		 			System.out.print(a.charAt(c));
	   		}
	   			
	   	}
	}
 

Zurück
Oben