String splitten

Helldevil

Mitglied
hi leute, ich habe folgendes Problem, ich soll einen String der Form a*(b+c) nach jedem sonderzeichen splitten, wie mach ich das?

Wie ich einen String splitte ist mir schon klar und ist auch soweit kein problem für mich eine entsprechende Funktion zu schreiben, problem dabei ist aber jetzt, dass ich nach jedem mathematischen Zeichen einen Split machen muss und das dann an einen Parser übergeben soll.Der Parser, den ich bekommen habe, akzeptiert aber momentan nur Strings der Form a * b ( b + c ),er soll aber beides akzeptieren, wie kann ich sowas implementieren??

Gruss
Christian
 

timbeau

Gesperrter Benutzer
Was für einen Parser hast du denn? Warum akzeptiert der nur eine einzige Formel?

Pattern (Java 2 Platform SE v1.4.2)

Du willst ja alles außer kleinbuchstaben gesplittet haben.

Java:
public void testFormel(){
		String input = "a*(b+c)";
		Pattern pattern = Pattern
				.compile("(\\W)");
		Matcher matcher = pattern.matcher(input);
		while (matcher.find()) {
			System.out.println(matcher.group());
		}
	}

liefert "*
(
+
)"

Aber das ist nicht das was du willst nehme ich an.
 

Helldevil

Mitglied
Hi hier ein beispiel für das was passieren sollte, natürlich macht er im eigentlichen Programm dann was anderes, aber es soll nur verdeutlichen was ich will

[JAVA=42]
public class split

{
public void split()
{
String t = "a+b";
String[] ts = t.split("\\b+");
for (int i = 0 ;i < ts.length;i++)
{
String eingabeElement = ts;
switch (eingabeElement.charAt(0))
{
case '+':
System.out.println("+");
case '-':
System.out.println("-");
}
}
}
}
[/code]

Problem ist hierbei, wie splitte ich das, dass keine "java.lang.StringArrayIndexOutofBoundsException: String index out of Range 0" kommt
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Ich würde bei sowas die Finger von Regex lassen, das wird schnell zu kompliziert, lieber selber einen DEA (deterministischer endlicher Automat) implementieren, dürfte dann auch schneller als Regex sein.
 
N

nillehammer

Gast
Wenn ich Deinen Code richtig verstehe, willst Du gleichzeitig eigentlich zwei Sachen:
  1. Nach den Rechenzeichen splitten, um die Operanden zu erhalten
  2. Gleichzeitig aber irgendwie auch das Rechenzeichen ermitteln, um die Operation zu bestimmen
Beides gleichzeitig geht mit
Code:
String.split
nicht. Beim Ergebnisarray eines Splits sind nämlich die Trennzeichen (also die Rechenzeichen) nicht im Ergebnisarray enthalten.

Als erste Nährung an die Lösung würde ich darum empfehlen mit
Code:
indexOf
und
Code:
substring
zu arbeiten
 

Helldevil

Mitglied
Also um alles mal zu verdeutlichen
hier ist unser Aufgabentext
http://stl-www.htw-saarland.de/fach/ss12-ps2/u17.pdf

Das läuft auch alles soweit aufgabenkonform, d.h. wir haben ne hashtable, wir haben nen parser, usw...
problem ist halt nur, dass ich bisher nur strings der Form "a * ( b + c )" verarbeiten kann, sprich die einzelnen operatoren bzw operanten müssen durch ein leerzeichen getrennt sein, damit der parser das verarbeitet, ich will aber den eingelesenen String so splitten, dass der parser eben auch die Form"a*(b+c)" akzeptiert...dies versuch ich momentan zu implementieren und bekomm es irgendwie nicht hin, ich kann hier schlecht den gesamten Quellcode des Programms posten, das würde den Rahmen sprengen.

Momentan ist es so, dass wir eine Klasse haben, die eine datei einliesst und Aufgabenkonform entsprechend die Deklarationsblöcke auf die einzelnen Programmteile verteilt.
Im Falle des Parsers ist es nun so, dass der String eingelesen wird und an den Parser übergeben wird.von diesem wird der String dann entsprechend gesplittet.
Hier mal der entsprechende Quelltext des Parsers

[JAVA=42]
import java.util.*;
/**
* Write a description of class Parser here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Parser implements ParserInterface
{

private Stack<ExTreeNode> opndStack;
private Stack<Operator> optStack;

public Parser()
{
opndStack = new Stack();
optStack = new Stack();
}

public ExpressionTreeInterface parse(String eingabeString,SymbolTabelleInterface tabelle)
{
String[] eingabeArray = eingabeString.split("\\s+");
for (int i = 0; i < eingabeArray.length;i++)
{
String eingabeElement = eingabeArray;
switch (eingabeElement.charAt(0))
{
case '(' :
KlammerAuf klammerAuf = new KlammerAuf();
optStack.push(klammerAuf);
break;
case ')' :
KlammerZu klammerZu = new KlammerZu();
bearbeiteKlammerZu(klammerZu);
break;
case '+' :
Plus plus = new Plus();
bearbeiteOpt(plus);
break;
case '-' :
Minus minus = new Minus();
bearbeiteOpt(minus);
break;
case '*' :
Mal mal = new Mal();
bearbeiteOpt(mal);
break;
case '/' :
Durch durch = new Durch();
bearbeiteOpt(durch);
break;
default : //Irgendein String der kein Operator ist -> Operand
Operand opd = new Operand(eingabeElement);
try
{
bearbeiteOpd(opd,tabelle);
}
catch (Exception e)
{
System.out.println("Operand " + opd + " nicht in Tabelle; beende Programm");
System.exit(-1);
}
break;
}
}
ExTreeNode root;
while (!optStack.empty())
{
Operator opt = optStack.pop();
ExTreeNode right = opndStack.pop();
ExTreeNode left = opndStack.pop();
ExTreeNode optNode = new OptNode(opt,left,right);
opndStack.push(optNode);
}
root = opndStack.pop();
ExpressionTreeInterface tree = new ExpressionTree(root);
System.out.println(tree);
return tree;
}

private void bearbeiteOpd(Operand opd,SymbolTabelleInterface tabelle) throws Exception
{
String name = opd.getName();
if (!tabelle.exists(name)) throw new Exception("Nicht in Tabelle");
OpdNode opdNode = new OpdNode(opd);
opndStack.push(opdNode);
//Kreiere opnd-Knoten, push Knotenpointer auf opndStack
}

private void bearbeiteKlammerZu(KlammerZu klammerZu)
{
while (!optStack.empty())
{
Operator optTop = optStack.pop();
if (optTop instanceof KlammerAuf)
{
break;
}
else
{
ExTreeNode right = opndStack.pop();
ExTreeNode left = opndStack.pop();
ExTreeNode optTopNode = new OptNode(optTop,left,right);
opndStack.push(optTopNode);
}
}
}

private void bearbeiteOpt (Operator opThis)
{
if (optStack.empty())
{
optStack.push(opThis);
}
else
{
while (!optStack.empty())
{
Operator opTop = optStack.pop();
if (opTop instanceof KlammerAuf)
{
optStack.push(opTop);
}
else
{
if (opTop.compareTo(opThis) < 0)
{
optStack.push(opTop);
}
else
{
ExTreeNode right = opndStack.pop();
ExTreeNode left = opndStack.pop();
ExTreeNode optTopNode = new OptNode(opTop,left,right);
opndStack.push(optTopNode);
}
}
if ((opTop instanceof KlammerAuf) || (opTop.compareTo(opThis) < 0))
{
break;
}
}
optStack.push(opThis);
}
}

}
[/code]

Das Problem beschränkt sich auf folgenden QuellcodeTeil

[JAVA=42]
public ExpressionTreeInterface parse(String eingabeString,SymbolTabelleInterface tabelle)
{
String[] eingabeArray = eingabeString.split("\\s+");
for (int i = 0; i < eingabeArray.length;i++)
{
String eingabeElement = eingabeArray;
switch (eingabeElement.charAt(0))
{
case '(' :
KlammerAuf klammerAuf = new KlammerAuf();
optStack.push(klammerAuf);
break;
case ')' :
KlammerZu klammerZu = new KlammerZu();
bearbeiteKlammerZu(klammerZu);
break;
case '+' :
Plus plus = new Plus();
bearbeiteOpt(plus);
break;
case '-' :
Minus minus = new Minus();
bearbeiteOpt(minus);
break;
case '*' :
Mal mal = new Mal();
bearbeiteOpt(mal);
break;
case '/' :
Durch durch = new Durch();
bearbeiteOpt(durch);
break;
default : //Irgendein String der kein Operator ist -> Operand
Operand opd = new Operand(eingabeElement);
try
{
bearbeiteOpd(opd,tabelle);
}
catch (Exception e)
{
System.out.println("Operand " + opd + " nicht in Tabelle; beende Programm");
System.exit(-1);
}
break;
}
}
[/code]

Zur Verdeutlichung hier noch die MainShellKlasse mit deren Hilfe die Textdatei eingelesen wird

[JAVA=42]

import java.io.*;
import java.util.*;
/**
* Die Klasse Tree234Shell erlaubt es dem Nutzer ueber eine Shell die Klasse Tree234 zu testen
*
*
* @author Christian Geers,Markus Hubig
* @version 0.3
*/

public class MainShell
{
private File datei;
// private ExpressionTree tree = ExpressionTree();
private SymbolTabelleInterface symbolTabelle = new SymbolTabelle();
private ParserInterface parser = new Parser();
/**
* Konstruktor
*/

public MainShell(String dateiName)
throws IOException, DateiException
{
File datei = getFile(dateiName);
load(symbolTabelle,parser,datei);
}

/**
* main methode fuer ExpressionTreeShell
*/
public static void main(String[] args) throws Exception
{
if (args.length < 1)
throw new Exception("Syntaxfehler:Es wurde kein Dateinamen angegeben");
String dateiName = args[0];
MainShell shell = new MainShell(dateiName);
}

public File getFile(String dateiName)
throws DateiException
{
File datei = new File(dateiName);
DateiException.dateiExistiertNicht(datei);
DateiException.dateiNichtLesbar(datei);
DateiException.istKeineDatei(datei);
return datei;
}

public void load (SymbolTabelleInterface symbolTabelle,ParserInterface parser, File datei)
throws IOException
{
LineNumberReader read = new LineNumberReader(new FileReader(datei));
String line;
ExpressionTreeInterface tree = new ExpressionTree();
//todo, prüfungen ob string vorhanden, splitten in substrings,evaluate einbauen,exceptions,...
while (!(line = read.readLine()).isEmpty())
{
String identifier = line.substring(0);
if (!symbolTabelle.exists(identifier))
{
System.out.println( "\nBearbeeitete Zeile : " + read.getLineNumber() + " : " + line );
symbolTabelle.insert(identifier,false);
System.out.println( identifier + " eingefuegt");
}
else
{
System.out.println(identifier + " ist bereits vorhanden");
}
}
while(!(line = read.readLine()).isEmpty())
{
System.out.println( "\nBearbeeitete Zeile : " + read.getLineNumber() + " : " + line );
String ausdruck = line.substring(0);
tree = parser.parse(ausdruck,symbolTabelle);


}
while(!(line = read.readLine()).isEmpty())
{
String[] zuweisung = line.split("=");
if (zuweisung.length != 2)
{
System.out.println("Zuweisung hat nicht richtiges Format");
}
for (int i = 0 ; i < 2 ; i++)
{
zuweisung = zuweisung.trim();
}
Integer wertIntg = new Integer(0);
int wert = wertIntg.parseInt(zuweisung[1]);
symbolTabelle.insert(zuweisung[0],wert);
System.out.println(zuweisung[0] + " mit Wert " + wert + " eingefuegt");
}
int ergebnis = tree.evaluate(symbolTabelle);
System.out.println("Ergebnis: " + ergebnis);
read.close();
}
}

[/code]
Vielen Dank für eure Hilfe

Gruss
Christian
 
Zuletzt bearbeitet:

tagedieb

Top Contributor
Hier noch eine Variante mit dem guten alten StringTokenizer :D

Java:
        StringTokenizer tokenizer = new StringTokenizer("a*(b+c)", "+-*/()", true);
        String[] mathArgs = new String[tokenizer.countTokens()];
        for (int i = 0; i < mathArgs.length; i++) {
            mathArgs[i] = tokenizer.nextToken();
        }

        System.out.println(Arrays.asList(mathArgs));
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T String splitten Java Basics - Anfänger-Themen 3
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
CptK Datentypen String splitten, ä,ö,ü, etc ignorieren Java Basics - Anfänger-Themen 1
J String splitten Java Basics - Anfänger-Themen 3
A String mit mehreren Zeilen splitten Java Basics - Anfänger-Themen 4
J String splitten und weiter einarbeiten in einer Methode? Java Basics - Anfänger-Themen 11
S String splitten und berichtigen? Java Basics - Anfänger-Themen 16
Z String splitten Java Basics - Anfänger-Themen 2
S String ab dem Wechsel Buchstaben zu Zahlen splitten Java Basics - Anfänger-Themen 14
S String splitten und in ArrayList speichern Java Basics - Anfänger-Themen 4
A String Mehrfach Splitten Java Basics - Anfänger-Themen 1
B String in in bestimmten abschnitten splitten Java Basics - Anfänger-Themen 2
S String Splitten Java Basics - Anfänger-Themen 2
T String splitten Java Basics - Anfänger-Themen 2
C Methoden String richtig splitten Java Basics - Anfänger-Themen 5
C Regex String splitten Java Basics - Anfänger-Themen 5
T String splitten beim wechsel vom buchstabe zu zahl! Java Basics - Anfänger-Themen 8
2 String splitten und nacheinander löschen Java Basics - Anfänger-Themen 11
J Datentypen String splitten ohne festen Ausdruck Java Basics - Anfänger-Themen 8
T String in String Array splitten Java Basics - Anfänger-Themen 4
StrikeTom String mehrmals splitten Java Basics - Anfänger-Themen 11
S String in Integer Array splitten Java Basics - Anfänger-Themen 2
A String nach bestimmten kriterien splitten Java Basics - Anfänger-Themen 13
M String splitten mit split() Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 2
K String splitten Java Basics - Anfänger-Themen 4
S String splitten Java Basics - Anfänger-Themen 4
O String splitten Java Basics - Anfänger-Themen 9
M String splitten Java Basics - Anfänger-Themen 2
G String nach Pluszeichen splitten Java Basics - Anfänger-Themen 2
G String splitten Java Basics - Anfänger-Themen 3
T String splitten und auf fehler abfragen Java Basics - Anfänger-Themen 3
U String splitten Java Basics - Anfänger-Themen 12
J Java Aufgabe -> String einlesen, splitten,Substring & Java Basics - Anfänger-Themen 3
loadbrain String splitten Java Basics - Anfänger-Themen 3
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
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
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben