Erste Schritte Im arithm. Ausdruck Zeichen trennen?

Terry12

Aktives Mitglied
hi,

wir sollen einen arithm. Ausdruck einlesen z.B :

( ( a + b ) * ( ( c - d ) ) )

Die einzelnen Zeichen lese ich anschließend nacheinander in eine Queue ein.
Dabei ist bei mir im moment das Leerzeichen zwischen jedem Zeichen das Trennzeichen für die Wörter,
wenn jetzt aber ein Ausdruck ohne Trennzeichen (Leerzeichen) da steht, gehts nimmer...
wie könnte man es anders machen?

also operatoren sind: ( , ) , + , - , * , /

und die Identifier dazwischen können sonstige Strings sein....

im moment mach ich das mit regex :
String[] teile = line.split(" +");
 

Terry12

Aktives Mitglied
naja das Problem ist aber dass die Identifier dazwischen nicht nur aus einem char bestehen können.
Es könnten auch Namen oder sonst was sein : "Hans" , "aa", "bb" ,"cc" usw.
 

nrg

Top Contributor
schon klar. du überprüfst jedes zeichen, ob es ein operator ist. wenn nicht, fügst du es einem stringbuilder hinzu. jedes mal, wenn du einen operator gefunden hast, merkst du dir den string im stringbuilder (=Identifier) und leerst ihn.
 

Terry12

Aktives Mitglied
hm das ging bisschen zu schnell :D
operatoren adde ich in den stringbuilder und übergebe den operator wieder an die funktion, dabei leere ich ihn, ok
und was ist mit den operanden bzw identifiern?
 

nrg

Top Contributor
möchtest du einen parser für mathematische formeln schreiben oder den string einfach zerhacken, um diesen einfach "weiterzureichen"?
 

Terry12

Aktives Mitglied
ich möchte den String einfach zerhacken und nacheinander jedes "Wort" weiterreichen, z.B

a + b * (cc-ddd)

=>

a
+
b
*
(
cc
-
ddd
)

also bei den Operatoren muss getrennt werden, und solange kein operator kommt, jedes zeichen weiterlesen und als ganzes Wort weitergeben solange bis wieder ein operatorzeichen kommt...
 

Claudia92

Mitglied
Ich habe es aus eigenem Interesse so versucht, wie es nrg erklärt hat:
Java:
		String input = "a + b * (cc-ddd)";
		ArrayList<String> separated = new ArrayList<>();
		StringBuilder sb = new StringBuilder();
		
		for (char c : input.toCharArray()) {
			if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')') {
				if (sb.length() > 0)
					separated.add(sb.toString());
				separated.add(String.valueOf(c));
				sb = new StringBuilder();
			} else if (c != ' ')
				sb.append(c);
		}
		if (sb.length() > 0)
			separated.add(sb.toString());
		
		System.out.println(separated);
Da lässt sich bestimmt noch etwas verbessern, aber im Großen und Ganzen sollte es das sein, was du wolltest. :)
 

timbeau

Gesperrter Benutzer
Aber nicht viel, ist schon ganz gut mE.

Java:
String input = "a + b * (cc-ddd)";
		List<String> separated = new ArrayList<String>();
		StringBuilder sb = new StringBuilder();
		for (char c : input.toCharArray()) {
			if (c == '+' || c == '-' || c == '*' || c == '/' || c == '('
					|| c == ')') {
				if (sb.length() > 0) {
					separated.add(sb.toString());
					sb.setLength(0);
				}
				separated.add(String.valueOf(c));
			} else {
				if (c != ' ') {
					sb.append(c);
				}
			}

		}
 

Crian

Top Contributor
Falls das letzte Zeichen kein Operator ist, fehlt da noch ein
Code:
separated.add(...)
, oder?

Ein Test ergab, dass dem so ist. Ein

Java:
        if (sb.length() > 0) {
            separated.add(sb.toString());
        }

am Ende hilft.

Als ganzer Testcode:

Java:
package forumProblems;

import java.util.ArrayList;
import java.util.List;

public class FormulaParser {

    private List<Character> symbols;

    public FormulaParser(String input) {
        initSymbols();
        List<String> separated = splitFormula(input);
        System.out.println("Aus [" + input + "] wird " + separated);
    }

    private void initSymbols() {
        symbols = new ArrayList<Character>();
        symbols.add('+');
        symbols.add('-');
        symbols.add('*');
        symbols.add('/');
        symbols.add('(');
        symbols.add(')');
    }

    private List<String> splitFormula(String input) {
        List<String> separated = new ArrayList<String>();

        StringBuilder sb = new StringBuilder();
        for (char c : input.toCharArray()) {
            if (symbols.contains(c)) {
                if (sb.length() > 0) {
                    separated.add(sb.toString());
                    sb.setLength(0);
                }
                separated.add(String.valueOf(c));
            }
            else {
                if (c != ' ') {
                    sb.append(c);
                }
            }
        }
        if (sb.length() > 0) {
            separated.add(sb.toString());
        }

        return separated;
    }

    public static void main(String[] args) {
        new FormulaParser("a + b * (cc-ddd)");
        new FormulaParser("a + b * (cc-ddd) + eee");
    }

}

Ausgabe

Code:
Aus [a + b * (cc-ddd)] wird [a, +, b, *, (, cc, -, ddd, )]
Aus [a + b * (cc-ddd) + eee] wird [a, +, b, *, (, cc, -, ddd, ), +, eee]
 
Zuletzt bearbeitet:
B

buzz!dev

Gast
So etwas sollte man eher nicht selbst schreiben, sondern die Java eigenen Methoden verwenden. String.split() bringt eigentlich alles mit, auch wenn regular expressions vielleicht nicht jedermanns Sache sind.

Java:
		final String SEPARATOR = "(?<=\\+)|(?=\\+)|(?<=\\*)|(?=\\*)|(?<=\\-)|(?=\\-)|(?<=\\()|(?=\\))";
		String input = "a + b * (cc-ddd) + eee".replace(" ", "");

		String[] separated = input.split(SEPARATOR);
		System.out.println(Arrays.toString(separated));

Alternativ der wahrscheinlich leichter verständliche StringTokenizer:
Java:
		final String SEPARATOR = "+-*()";
		String input = "a + b * (cc-ddd) + eee".replace(" ", "");

		StringTokenizer tokenizer = new StringTokenizer(input, SEPARATOR, true);
		while (tokenizer.hasMoreTokens())
			System.out.println(tokenizer.nextToken());
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Reguläre Ausdruck Java Basics - Anfänger-Themen 6
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
K Warum zeigt dieser reguläre Ausdruck true an? Java Basics - Anfänger-Themen 1
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
KogoroMori21 Boolscher Ausdruck Java Basics - Anfänger-Themen 15
C Ausdruck Java Basics - Anfänger-Themen 4
E Boolescher Ausdruck Java Basics - Anfänger-Themen 1
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
O Lambda Ausdruck mit Wildcard einschränken Java Basics - Anfänger-Themen 5
F Ist das ein korrekter Regex-Ausdruck? Java Basics - Anfänger-Themen 12
B Interface Java Lambda Ausdruck. Java Basics - Anfänger-Themen 11
B Regulärer Ausdruck Java Basics - Anfänger-Themen 12
G Boolschen Ausdruck true machen Java Basics - Anfänger-Themen 2
F Ausdruck wirft unerwarteten Error Java Basics - Anfänger-Themen 2
D Regulärer Ausdruck Java Basics - Anfänger-Themen 8
K Regulären Ausdruck in Java abbilden Java Basics - Anfänger-Themen 4
B Regulärer Ausdruck Java Basics - Anfänger-Themen 3
M Lambda - Ausdruck zu Beschreibung erstellen Java Basics - Anfänger-Themen 7
D Java Ausdruck erzeugen / Formular Java Basics - Anfänger-Themen 4
B Boolscher Ausdruck für mich unverständlich Java Basics - Anfänger-Themen 7
A regulären Ausdruck mit Hilfe der Klasse Scanner in einem String finden Java Basics - Anfänger-Themen 2
J Frage zu bestimmtem Ausdruck Java Basics - Anfänger-Themen 2
G Lambda Ausdruck: Welche Methode ist die Richtige? Java Basics - Anfänger-Themen 1
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
M Arithemtischer Ausdruck unklar Java Basics - Anfänger-Themen 2
C Regulärer Ausdruck matched nicht Java Basics - Anfänger-Themen 2
A Lässt sich dieser Ausdruck irgendwie einfacher schreiben? Java Basics - Anfänger-Themen 4
H Regulären Ausdruck automatisch erstellen Java Basics - Anfänger-Themen 5
D Boolescher Ausdruck - Problem Java Basics - Anfänger-Themen 6
B Regulärer Ausdruck gesucht Java Basics - Anfänger-Themen 6
M regulärer Ausdruck funktioniert nicht Java Basics - Anfänger-Themen 6
R Suche Regex Ausdruck für HTML Java Basics - Anfänger-Themen 11
E Hilfe bei einem Regulären Ausdruck Java Basics - Anfänger-Themen 7
X Regulärer Ausdruck für einen FileNameFilter Java Basics - Anfänger-Themen 2
S Einfaches Regulaerer Ausdruck Problem Java Basics - Anfänger-Themen 7
S regulärer Ausdruck HTML Java Basics - Anfänger-Themen 5
turmaline Ein regulärer Ausdruck für HTML-Sonderzeichen Java Basics - Anfänger-Themen 3
3 3. Element mit regulären Ausdruck suchen Java Basics - Anfänger-Themen 12
M regex-Ausdruck irgendein Buchstabe 1 mal Java Basics - Anfänger-Themen 8
S Was bedeutet dieser ausdruck? Java Basics - Anfänger-Themen 9
S String nach Ausdruck durchsuchen und Folgeattribut ausgeben Java Basics - Anfänger-Themen 3
H Ausdruck vereinfachen Java Basics - Anfänger-Themen 8
J Datentypen String splitten ohne festen Ausdruck Java Basics - Anfänger-Themen 8
H while schleife ohne ausdruck Java Basics - Anfänger-Themen 7
H Datei durchsuchen mit Regex-Ausdruck Java Basics - Anfänger-Themen 14
O Gibt es dafür einen regulären Ausdruck? Java Basics - Anfänger-Themen 9
B regulärer Ausdruck mit Metazeichen Java Basics - Anfänger-Themen 4
O RegEx-Ausdruck gesucht Java Basics - Anfänger-Themen 2
C bedingten ausdruck zu if-anweisung Java Basics - Anfänger-Themen 3
D regulärer Ausdruck: ^ $ Java Basics - Anfänger-Themen 6
O Mal wieder ein Regex-Ausdruck gesucht! Java Basics - Anfänger-Themen 5
F Regulärer Ausdruck warum false ? Java Basics - Anfänger-Themen 3
O Regulärer Ausdruck gesucht Java Basics - Anfänger-Themen 2
S Regulärer Ausdruck - alles was keine Zahl ist entfernen Java Basics - Anfänger-Themen 2
S regulärer ausdruck zum zählen eines wortes Java Basics - Anfänger-Themen 4
K Regulärer Ausdruck Java Basics - Anfänger-Themen 7
R Regulären Ausdruck geht nicht Java Basics - Anfänger-Themen 2
L Regulärer Ausdruck Java Basics - Anfänger-Themen 2
J Bitte um Erklärung für einen Java-Ausdruck Java Basics - Anfänger-Themen 8
M regulärer Ausdruck Java Basics - Anfänger-Themen 3
T Wie sieht ein '.' im regulären Ausdruck aus? Java Basics - Anfänger-Themen 2
G Wie erstellt man komplexen regulären Ausdruck Java Basics - Anfänger-Themen 5
G Boolscher Ausdruck Java Basics - Anfänger-Themen 11
R Reguläre Ausdruck definieren Java Basics - Anfänger-Themen 3
G Substrings in regulärem Ausdruck Java Basics - Anfänger-Themen 2
F Boolescher Ausdruck (String) in boolean konvertieren Java Basics - Anfänger-Themen 5
F Der "super" Ausdruck Java Basics - Anfänger-Themen 4
S Ausdruck zur Laufzeit auswerten Java Basics - Anfänger-Themen 10
G Was zum Teufel ist denn so ein Ausdruck"variabel : vari Java Basics - Anfänger-Themen 8
X Regulärer Ausdruck Java Basics - Anfänger-Themen 6
E regulärer Ausdruck -> wo ist der Fehler Java Basics - Anfänger-Themen 9
G regulärer Ausdruck alles was zwischen ' ' steht Java Basics - Anfänger-Themen 4
P Zeile als regulärer Ausdruck Java Basics - Anfänger-Themen 5
G Regulärer Ausdruck: gefunden und gleichzeitig nicht gefunden Java Basics - Anfänger-Themen 5
M Scanner soll nach einem Ausdruck splitten Java Basics - Anfänger-Themen 2
R Ausdruck Java Basics - Anfänger-Themen 2
M regulärer Ausdruck zum Parsen einer E-Mail Signatur Java Basics - Anfänger-Themen 16
T Regulärer Ausdruck Java Basics - Anfänger-Themen 4
J Was sagt mir dieser Ausdruck? Java Basics - Anfänger-Themen 9
G regulärer ausdruck zur überprüfung von ip-adresse? Java Basics - Anfänger-Themen 13
S Ausdruck? Java Basics - Anfänger-Themen 5
J Quelltext mit komischen griechischen Zeichen Java Basics - Anfänger-Themen 4
T or zeichen Java Basics - Anfänger-Themen 2
L 4 stelliges Passwort aus bestimmten Zeichen. Java Basics - Anfänger-Themen 27
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
O Array mit einem Zeichen vergleichen Java Basics - Anfänger-Themen 1
S Was bedeutet das Zeichen := Java Basics - Anfänger-Themen 9
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
L Zeichen an bestimmter Stelle auslesen Java Basics - Anfänger-Themen 4
S Arrayausgabe und nur einmal ein Zeichen davor Java Basics - Anfänger-Themen 12
johnboyne Java Zeichen Trennen Java Basics - Anfänger-Themen 1
T Zeichen im String verschiebe Java Basics - Anfänger-Themen 17
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
pkm Regexproblem - Wie kann ich zwei oder mehr beliebige Zeichen matchen? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben