Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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".
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.
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
Nein. TU Dresden, aber wir haben ähnliche Aufgabe) Bei uns "aus AAADFGGG - A3DFG3" muss kommen. Ich habe versucht mit run legth encoding diese Aufgabe zu lösen, aber das geht nicht. Run-length encoding - Rosetta Code
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