Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
---- Logik (http://www.informatikerboard.de/board/board.php?boardid=16)
----- Java Rechnung (http://www.informatikerboard.de/board/thread.php?threadid=2338)
Geschrieben von Björn am 12.06.2015 um 19:14:
Java Rechnung
Meine Frage:
Hi zusammen :-)
folgendes Problem: Ich habe einen String mit Zahlen und Rechenzeichen. Ich möchte vor dem Mal-Zeichen die Zahl inklusive Vorzeichen mittels eines Substrings auslesen. Da im String ja + oder - und auch * oder / vorkommen kann wollte ich diese Fälle in der while-Anweisung abdecken. Leider bekomme ich immer eine OutofBounds-Exception (Zeile 23). Wenn ich nur eine Anweisung abfrage (also plus zum Beispiel) funktioniert es, nur bei mehreren nicht. Woran könnte das liegen?
Vielen Dank :-)
Meine Ideen:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
package javarechnung;
public class JavaRechnung
{
public static void main(String[] args)
{
String name = "15-16*6+24";
char mal = '*';
char minus = '-';
char plus = '+';
int zwischenSpeicher = 0;
String zahl1 = "";
for (int i=0; i<1000;i++)
{
if (name.charAt(i)==mal)
{
zwischenSpeicher = i;
do
{
--i;
}
while (name.charAt(i)!=minus || name.charAt(i)!=plus);
zahl1=name.substring(i,zwischenSpeicher);
break;
}
}
System.out.println(zahl1);
}
}
|
|
Geschrieben von eulerscheZahl am 13.06.2015 um 06:57:
code: |
1:
|
for (int i=0; i<1000;i++) |
|
Grob überschlagen hat der Inhalt der Variablen
name weniger als 1000 Zeichen. Da kriegst du ein OutOfBounds bezüglich der oberen Grenze.
Wenn du dann bei
--i; abziehst und vor dem '*' nicht an der selben Stelle '+' und '-' hast - was ja gar nicht geht, du brächtest && statt || - willst du auf charAt(-1) zugreifen. Das ist die Exception, die du letztlich angezeigt bekommst.
Geschrieben von Björn am 13.06.2015 um 09:09:
Super, danke dir. Da liegt das Problem.
Eine weitere Frage hätte ich noch:
Wenn ich den String name nehme und möchte mit der Methode replaceAll etwas ersetzen, funktioniert es nicht, z.B.
String name = "15-16*6+24";
name.replaceAll ("16*6",576);
Allerdings kommt da immer wieder der Ausgangsstring heraus. Liegt das vielleicht an dem Malzeichen, da es ein Char ist?
Vielen Dank :-)
Geschrieben von eulerscheZahl am 13.06.2015 um 09:34:
Strings sind immutable, können also nicht verändert werden. Daher geben Stringoperationen immer einen neuen String zurück. Den musst du auch auswerten:
code: |
1:
|
name = name.replaceAll ("16*6","576"); |
|
Das zweite Argument muss ein String sein.
Ich weise dich aber darauf hin, dass das Ergebnis der Multiplikation 96 ist.
Und das '*' macht Probleme, weil es in regulären Ausdrücken eine andere Bedeutung hat.
Geschrieben von Björn am 13.06.2015 um 09:37:
Mist, ich hatte bei 576 die Anführungszeichen vergessen.
code: |
1:
|
name = name.replaceAll ("16*6","576"); |
|
So war es eigentlich gedacht, wird aber auch nichts ändern?
Geschrieben von eulerscheZahl am 13.06.2015 um 09:42:
Ist mir dann auch noch aufgefallen, siehe edit.
replaceAll erwartet einen regulären Ausdruck, da ist das * schon reserviert, muss also escaped werden.
Geschrieben von Björn am 13.06.2015 um 09:47:
Danke für die Antworten :-)
Forensoftware: Burning Board, entwickelt von WoltLab GmbH