my task was to write a method that should combine letters which occur more then two times in a row. Example: ABBCCCDDDD -> ABBC3D4
I was told to us the library's In.java and Out.java for in and output. My problem is that the method skips the for-loop. I hope you can help me. If you have any questions about the code just ask me please
public class Aufgabe9_4 {
static void codieren(String s){
int Zähler = 0;
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i<s.length()-1; i++){
if (a[i] == a[i+1] && a[i] ==a[i+2]){
Zähler = 3;
while (a[i] == a[i+Zähler]) Zähler++;
i = i + Zähler;
}
Out.println(a[i] + Zähler);
}
}
public static void main(String args[]) {
Out.println("Geben sie eine Reihenfolge von Buchstaben ein!");
String s = In.readString();
Out.println("Die Codierung lautet:");
codieren(s);
}
}
I have corrected the code and gotten your expected result: ABBC3D4
All array accesses must be within the array range. When you access [i+2]
ensure your i
value is always < length-2
. (In other words, the index you're accessing (i+2
) must always be < length
.)
With the while loop, it's a little trickier as [i+Zähler]
must also be < length
but Zähler
can be any value. For this I added (i+Zähler) < s.length()
as a check. It must be before a[i] == a[i+Zähler]
as it needs to be evaluated first.
Same goes for your original code: i = i + Zähler
. You were overshooting by 1, so I had to add - 1
. It ensured print(a[i])
will not fail, by negating the effect of the last Zähler++
.
println(a[i] + Zähler)
will print the numeric sum of a[i]
added with Zähler
(a char value is an integer at heart). Clearly this is not what you want, so I split it.
I also added the check if (Zähler != 0)
as you didn't want zeros printed.
The print
function, instead of println
, prints on the same line.
Something I didn't correct in the code below: When you're accessing an array in a for loop, the loop parameters should better use the length of that same array. So by right, you should be using a.length
, not s.length()
.
Something else: Try rewriting the program using String.charAt()
.
The working program is on Ideone here (link).
static void codieren(String s){
int Zähler = 0;
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i<s.length()-2; i++){
if (a[i] == a[i+1] && a[i] ==a[i+2]){
Zähler = 3;
while ((i+Zähler) < s.length() && a[i] == a[i+Zähler]) {
Zähler++;
}
i = i + Zähler - 1;
}
System.out.print(a[i]);
if (Zähler != 0) {
System.out.print(String.valueOf(Zähler));
}
}
}
This is really a comment, but I need to include formatted output and code.
I think the problem may be a combination of a program failing due to an exception and an output method that is not showing the prior output on exception.
I used System.out.println to output in a program based on the question source code, and got:
65
66
66
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Test.codieren(Test.java:8)
at Test.main(Test.java:18)
71
ArrayIndexOutOfBoundsException means that you attempted to access an array using an index outside the range 0 through length-1, using an index that does not exist, in this case 10.
My modified program is:
public class Test {
static void codieren(String s) {
int Zähler = 0;
char[] a = s.toUpperCase().toCharArray();
for (int i = 0; i <= s.length() - 1; i++) {
if (a[i] == a[i + 1] && a[i] == a[i + 2]) {
Zähler = 3;
while (a[i] == a[i + Zähler])
Zähler++;
i = i + Zähler;
}
System.out.println(a[i] + Zähler);
}
}
public static void main(String args[]) {
String s = "abbcccdddd";
codieren(s);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With