View Full Version : [Runde 4] - Strings gscheit einlesen
hallo,
ich hab ein problem zu folgender spezifikation: http://eprog.sourceforge.net/eprog/4109/xortree.html
da soll als input ein string eingelesen werden, der beispielsweise so ausschaut:
1XOR2:=XOR2 2XOR2:=0 =
mit keiner festen länge oder so.
wie soll ich denn da die strings gscheit einlesen, bzw. dann verarbeiten?
kann das mit split("XOR") gehen? da kann ich die einzelnen zahlen ja trotzdem nicht mit dem index ansprechen, weil ja hinter dem = entweder noch ein XOR oder 0/1 stehen kann...
irgendwer eine idee? wäre dankbar
Plantschkuh!
03-01-2005, 17:09
Die Gleichungen mit readWord einzeln einlesen, oder aber gleich die ganze Zeile (kann die EprogIO das? Ich will es gar nicht wissen) und dann mit split(" ") in Worte zerpflücken.
Die einzelnen Gleichungen mußt du dann wohl irgendwie parsen. Eine primitive Methode: Such mittels indexOf das erste Vorkommen von "XOR"; alles davor muß eine Zahl (d.h. eine Folge von Ziffern) sein, danach muß eine Zahl und ":=" kommen. Nach dem '='-Zeichen muß eine Ziffer oder ein 'X' kommen, etc. Ein paar if-Statements sollten reichen.
...und dann mit split(" ") in Worte zerpflücken.
kann split() denn das?? kann man mit split denn nicht nur einzelne Strings voneinander trennen z.B.
ASD;EDER;CEFE ---> als Trennzeichen ";" verwenden und dann bekommt man
ASD EDER CEFE
man müsste ja eigentlich "XOR" als "Trennzeichen" verwenden, oder?
lg,
Plantschkuh!
03-01-2005, 18:40
class Foo
{
public static void main(String args[])
{
String s =
"1XOR1:=XOR2 2XOR2:=XOR3 2XOR1:=0 1XOR2:=0 1XOR3:=0 2XOR3:=1 =";
String ss[] = s.split(" ");
for (int i = 0; i < ss.length; i++)
System.out.println(ss[i]);
}
}
verdammt... gutes split() :cool:
lg,
das hilft mir zwar schon etwas weiter, aber das problem ist immer noch, dass ja nach dem = entweder ein neues XOR stehen kann oder eine zahl (0 oder 1). somit kann ich die im neuen string eingelesenen zahlen doch nicht eindeutig zuordnen, sodass ich mit ihren indizes weiter arbeiten kann. das war auch das eigentliche problem. oder... hmm, eigentlich müsste eine zweite split() das problem lösen... ich probier das mal. aber danke soweit!
Wenn du mit der EprogIO.readWord arbeitest, schaffst du es sowieso nicht, so einen Eingabestring mit Leerzeichen zu bekommen - du kannst nur in einer Schleife mehrere Teilstrings (immer bis zum nächsten Whitespace) einlesen. Dann stellt sich das Problem eh nicht.
den zweiten Teil von einem einfachen, gesplitteten String "2XOR2:=XOR3" oder "2XOR1:=0" kannst du ja dann leicht überprüfen... ("XOR3" oder "0")
könntest auch die einzelnen Stringteile die du durch readWord bekommen hast in einen Vector schreiben! des is sowas wie ein Array nur hat der zur Laufzeit keine fixe länge.....
duracell
04-01-2005, 11:55
hmm.. ist die Eingabe wirklich mit Trennzeichen (" ") vorgesehen? Da die Klasse EprogIO zum Einlesen von Strings ausschliesslich die Methode readWord() anbietet, kann ich mir das kaum vorstellen. Falls doch, müsste ein bestimmtes Eingabezeichen zur Terminierung der Eingabe definiert sein.
is eh ein trennzeichen definiert, "=", das problem is, dass ja auch schon im string selber "="'s (;)) vorkommen. das erschwert das schon ziemlich.
is eh ein trennzeichen definiert, "=",
Jetzt mal ganz naiv gefragt. Wieso nicht ":=" als Trennsymbol verwenden?
Bzw. Wenn Du Endsymbol meinst, in Pseudocode:
s=readWord();
while(s != "=") {
mach_was(s);
s=readWord();
}
naja dann brich halt nur ab wenn der string die länge 1 hat und ein = drinnen is.....
"=" ist ein String mit der Länge 1. Wenn der auftritt, weißt du, dass dein Programm aufhören soll, Daten einzlesen. Ist also ne spitzen Abbruchbedingung!
---edit---
@BUBU: genau meine Rede!:thumb:
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.