Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Logik » Java Rechnung » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Java Rechnung
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Björn
unregistriert
Java Rechnung Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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);
    }
}
12.06.2015 19:14
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
13.06.2015 06:57 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Björn
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 :-)
13.06.2015 09:09
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von eulerscheZahl: 13.06.2015 09:41.

13.06.2015 09:34 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Björn
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?
13.06.2015 09:37
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ist mir dann auch noch aufgefallen, siehe edit.
replaceAll erwartet einen regulären Ausdruck, da ist das * schon reserviert, muss also escaped werden.

__________________
Syntax Highlighting fürs Board (Link)
13.06.2015 09:42 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Björn
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke für die Antworten :-)
13.06.2015 09:47
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Logik » Java Rechnung