String kürzen

anonymous91

Mitglied
Meine Aufgabe ist es ein Programm zu schreiben, welches als Konsolenparameter einen String erhält, und den komprimierten String auf der Konsole ausgibt. Ich darf davon ausgehen, dass der Eingabestring nur Buchstaben enthält. Bei einer Eingabe von

aaabbcccccccabbbcbccc

wird die folgende Ausgabe erwartet:

a3bbc7ab3cbc3

Mein Code

Java:
import java.io.*;

public class String_komprimiert {

	public static void main(String[] args) throws IOException{  
	
		String string;
        BufferedReader reader;
        reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Please enter a string : ");
        string = reader.readLine();
        
        int counter;	//count the number of repeated characters
        int j;	// increment for second loop
        
        for (int i = 0; i < string.length(); i++)
        {        
        	j = i;	//initialize j with the last value of i
        	counter = 1;	//initialize counter for a new char
        	
               //count as long as the char at i equals the chars after it 
        	while (string.charAt(i) == string.charAt(j+1) ){
        		counter++;
        		j++;
        			
        	}
        	
        	// if char repeated more than twice, print out the char 
        	// with the number of repetition
        	
        	if (counter > 2){
        		System.out.print(string.charAt(i));
        		System.out.print(counter);
        		i = j ;
        	}
        	// if less than 2 repetitions, just give out the chars
        	else
        		System.out.print(string.charAt(i));
        }
	}

}

ich habe zwei Probleme. Und zwar, die letzte Buchstabenserie sieht man nicht. Bei der Eingabe von "aabbbccc" kommt "aab3" raus. Ich weiß nicht warum die letzten Buchstaben fehlen. Und das zweite Problem ist die Fehlermeldung "String index out of range".

Freue mich auf eure Hilfe
 
Es ist beides das selbe Problem:
[JAVA=23] while (string.charAt(i) == string.charAt(j+1) ){
counter++;
j++;

}
[/code]

In der Bedingung, wird nicht abgeprüft, ob j+1 noch innerhalb des Strings ist, deswegen fliegt beim letzen Durchlauf eine Exception und der letzte Buchstabe wird nicht mehr ausgegeben.
 
Vielen Dank für den Hinweis 🙂 aber leider fehlt jetzt immer noch der letze Buchstabe und die Exception ist immer noch nicht weg.

Java:
while (string.charAt(i) == string.charAt(j+1) && (j+1) < (string.length() ){
        		counter++;
        		j++;
        	}

Ich hoffe, du kannst mir weiterhelfen 🙂
 
Java:
for (int i = 0; i < string.length() -1; i++)
Damit sparst du dir dann deine Abfrage, ob j + 1 < length ist. Nebenbei solltest du die Bedingung (j+1) < (string.length()) als erstes abfragen, da Java dann die 2te Bedingung nicht mehr abfragen muss. Somit wäre deine Exception auch weg.
 
Das ist der endliche Code und damit kommen richtige Ausgaben aus:

Java:
import java.io.*;

public class String_komprimiert {

	public static void main(String[] args) throws IOException{  
	
		String string;
        BufferedReader reader;
        reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Please enter a string : ");
        string = reader.readLine();
        
        int counter;	//count the number of repeated characters
        int j;	// increment for second loop
        
        for (int i = 0; i < string.length(); i++)
        {        
        	j = i;	//initialize j with the last value of i
        	counter = 1;	//initialize counter for a new char
        	
        //count as long as the char at i equals the chars after it
        // and (j+1) still inside the string is
        	
        	while ((j+1) < string.length() && string.charAt(i) == string.charAt(j+1)){
        		counter++;
        		j++;
        			
        	}
        	
        	// if char repeated more than twice, print out the char 
        	// with the number of repetition
        	
        	if (counter > 2){
        		System.out.print(string.charAt(i));
        		System.out.print(counter);
        		i = j ;
        	}
        	// if less than 2 repetitions, just give out the chars
        	else
        		System.out.print(string.charAt(i));
        }
        System.out.println();
	}

}

Ich habe nur die Bedingungen getauscht (j+1) < string.length() und string.charAt(i) == string.charAt(j+1) wegen dem Hinweis von njans. Danke euch beiden 🙂
 
Zuletzt bearbeitet:
Interessante Idee. Ich kenne mich leider aber nicht damit aus um helfen zu können 🙁
Vielleicht bringt dir der Code ein paar Ideen. Viel Erfolg auf jeden Fall 🙂
 

Neue Themen


Zurück
Oben