![]() |
[java] koordinatenpaare als string einlesen
hallo!
ich habe ein problem bei folgender aufgabe: ich soll die koordinatenpaare eines vielecks als string einlesen, die folgenden aufbau haben: "(x,y)" wobei x und y Zahlen sind der datensatz wird durch "=" abgeschlossen also ich weiß wie man einen string einliest und dann die einzelnen zeichen ausliest -> damit könnte ich ja schon einmal die zahlen herausfiltern (ich hoffe dieser gedankengang von mir ist richtig - bin nämlich noch programmieranfänger!) nur wie speichere ich die zahlen dann um mit ihnen rechnen zu können - geht das vielleicht mit einem array? bin um jeden vorschlag dankbar! mfg poison |
angenommen x ist 145, dann liest du als string ein: 1 - 4 - 5
eine vorher angelegte INT-Variable zB "xkoor" xkoor=1 xkoor=xkoor*10+4 xkoor=xkoor*10+5 [damit ist xkoor das 145...] mit der ykoor machst es dann genauso dann übernimmst immer xkoor und ykoor in die nächste Zeile des Arrays... Problem gelöst? |
Schaue dir mal die klasse java.awt.Point an, die beschreibt an sich eine koordinate im awt. entweder du kannst diese verwenden, oder du schreibst dir eine eigene klasse die die koordinaten so darstellt, wie du sie brauchst, bzw wenn du damit rechen willst, wird dir sowiseo nichts übrigbleiben als eine eigene klasse und die rechnungsarten al methoden zu implementieren.
|
also ich habe jetzt versucht die zahlen mittels StringTokenizer herauszufiltern aber irgendwo gibt es ein problem...
Code:
was mache ich falsch? mfg poison |
Der String Tokenizer kennt nur einen Delimiter. Du versuchst ihm 3 mitzugenen. Wenn die Eingabe immer (y,y) aussieht dann, entferne den 1. und letzte char. Dan gehts mit einen Stringtokenizer mit delimiter ",". Ausserdem braucht der Tokenizer einen String als Delimiter, keinen char (" " statt ' ').
Ich würde es aber komplett anders machen: mit toCharArray in eine char Array umwandeln und dann mit Charakter.isDigit() die Zahlen rausparsen. Eventuell kannst mit indexOf(',') den String vorher noch teilen. |
Code:
wie bekomme ich da die zahlen heraus? danke auf jeden fall schon mal für deine hilfe! :) mfg poison |
array durchiterien (mit for oder while schleife (wenn char zahl ist diese wegspeichern (zB. in StringBuffer), wenn wieder kein digit mehr ist -> diese mit Integer.parseInt(StringBuffer.toString()) in int umwandeln.
2. Möglichkeit mit indexOf('(') und indexOf(',') und indexOf(')') und der substring Methode von String die Zahlen rausholen. 1.Möglichkeit ist etwas komplizierter, dafür funktinoniert sie mit allen Zahlen in einen String, egal was sonst noch drinnen steht. 2.Möglichkeit ist einfacher, dafür funktiniert sie nur, wenn der String (x,y) aussieht. |
guten morgen!
also ich bekomme noch eine fehlermeldung wenn ich folgenden code versuche zu kompilieren: Konvneck.java [27:1] isDigit(char) in java.lang.Character cannot be applied to (char[]) if ( (Character.isDigit(Zeichen)) ) // Soll überprüfen ob Zeichen eine Zahl ist ^ 1 error Errors compiling Konvneck. ich verstehe die ausgabe nicht ganz - was muss ich ändern? Code:
import eprog.*; |
Ich glaube da gehört statt:
Character.isDigit(Zeichen)) Character.isDigit(Zeichen[i])) <edit> Daher auch die Fehlermeldung: du versuchst die Funktion "isDigit" auf ein Array of char anzuwenden, nicht auf ein einzelnes char. </edit> Jak |
genau dass isses
|
ok ich habe das ganze mal ein bisschen überarbeitet:
Code:
import eprog.*;das - darf ich ja nicht in den string speichern weil der dann umgewandelt wird in einen float -> das brauch ich aber weil es ja sonst eine ganz andere zahl ist! außerdem nimmt er immer nur eine Zahl an -> also wenn ich eine kommazahl eingebe z.b 3.4 dann nimmt er 3 als zahl an und 4 als einzelne zahl an -> wie kann ich das ändern! ich danke euch schon mal für eure hilfe! mfg poison |
mach noch zusätzlich eine abfrage || (tmp == '.'), dann wird . dazu gespeichert
|
leider funktioniert das so nicht -> es tritt das gleiche problem wie beim -
wenn ich z.b. (3.4,5) eingebe macht er folgende fehlermeldung (3.4,5) java.lang.NumberFormatException: For input string: "." at java.lang.NumberFormatException.forInputString(Num berFormatException.java:48) at java.lang.FloatingDecimal.readJavaFormatString(Flo atingDecimal.java:1207) at java.lang.Float.parseFloat(Float.java:222) at Konvneck.einlesen(Konvneck.java:42) at Konvneck.main(Konvneck.java:15) Exception in thread "main" 7 3.0 außerdem bin ich gerade draufgekommen kann ich nicht mehr als ein koordinatenpaar einlesen dann macht er folgende fehlermeldung: eingabe: (3,4) (5,6) 3.0 4.0 java.lang.ArrayIndexOutOfBoundsException: 5 at Konvneck.einlesen(Konvneck.java:35) at Konvneck.main(Konvneck.java:15) Exception in thread "main" was muss ich hier machen? mfg poison |
der fehler beim konvertrieren liegt darin, dass du jede char gleich in eine float umwandelst, erst umwandeln, wenn wieder ein anderes zeichen als -,. oder zahl kommt (also die umwandlungsroutine in den else zweig stecken:
Code:
StringBuffer zahlen = new Stringbuffer();ps: java Konvention ist, dass variablennamen klein geschrieben werden, genauso wie methoden und packages, nur klassennamen werden groß geschrieben pps: den code oben habe ich nicht überprüft, nur so aus dem stegreif geschrieben ;) |
Mir ist gerade eine andere möglichkeit eingefallen:
Du suchst im String nach "(" und ")", machst String[] temp=input.substring(klammeraufposition,klammerzup osition).split(",",2); Damit hast du ein String[] temp float f; for (int i=0;i<temp.length;i++){ try{ f=Float.parseFloat(temp[i]) //mach irgendetwas mit f } catch (NumberFormatException e){} } Durch das parseFloat spart man sich das ganze suchen nach .,-,usw. Jak |
das ist mein 2. Vorschlag oben gewesen
|
Sorry, hab ich übersehen.
dein 2.Vorschlag würde wohl etwa so aussehen. Code:
float xKoord,yKoord; |
hallo jak!
danke für deinen vorschlag, aber jetzt habe ich mich schon so lange mit tarjans version herumgeschlagen - werd jetzt dabei bleiben ich glaube es gibt ein kleines problem mit der else if abfrage - das ganze wird zwar jetzt ohne fehler kompiliert aber wenn ich versuche etwas einzugeben macht er gar nichts... :( Code:
import eprog.*; |
habs mir angesehen, die zeile StringBuffer zahlen = new StringBuffer(); gehört vor die for schleife, ansonsten wird der stringbuffer immer wieder neu angelegt, so sollte es funktionieren:
Code:
StringBuffer zahlen = new StringBuffer(); |
noch eine zusätzliche frage: welchen editor beutzt du eigentlich zum erstellen der klassen?
|
@tarjan
ich benütze netbeans jetzt gibt er wieder etwas aus nur das problem ist dabei, dass er wenn ich z.b. (3,4) eingebe er mir folgendes ausgibt 3.0 34.0 danke auf jeden fall für deine hilfe bisher! :) mfg poison |
hmm, seltsam, ich habe deine lesemethode jetzt nachgebildet, und bei mir kommt der 1 nicht vor. schon mal das programm debugt? ich fragte eben wegen der möglichkeit des debuggens, da sehe ich meist solche fehler wie zb. das mit dem stringbuffer.
|
ok ich habe mich jetzt ein wenig gespielt mit dem ganzen und jetzt funktioniert auch das einlesen eines koordinatenpaares -> nur bei mehreren gibt es probleme
wenn ich z.b. eingebe (3,4) (4,5)= gibt er folgende fehlermeldung aus: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1444) at Konvneck.einlesen(Konvneck.java:31) at Konvneck.main(Konvneck.java:15) Exception in thread "main" das erscheint für mich auch klar weil ein substring ja bei einem leerzeichen endet -> nur wie kann ich dem jetzt entgegen wirken? außerdem wie kann ich die ganzen gewonnen zahlen speichern um mit ihnen weiterzuarbeiten... ein array geht ja mal nicht weil es ja eine vorgegebene größe haben muss -> die weiß ich ja aber nicht! Code:
import eprog.*; |
@ 1.Problem:
Befrage deinen debugger. Breakpoints sind meistens hilfreich. @2. Möglichkeit 1: Array, befor du etwas reinschreibst schaust du ob es voll ist, wenn es voll ist kopierst du das alte Array in ein doppelt so großes Möglichkeit 2: Hashtable Möglichkeit 3: LinkedList ... Jak |
ich habe schon versucht das problem mit dem debugger zu beheben leider finde ich trotzdem den fehler nicht... :(
mfg poison |
ArrayList ist das naheliegendes, arbeitet wie ein Array, nur ist variabel.
Der Fehler tritt beim Substring auf, da anscheinend indexOf -1 zurückliefert, d.h. er findet den gesuchten char nicht mehr im String -> Lösung: indexOf vorher feststellen, und danach erst substring mit if bedingung: Code:
int index1 = input.indexOf('('); |
danke für deine hilfe! :)
also das mit dem einlesen ist nun kein problem mehr -> dafür kann ich das ganze nicht zu einer methode mit rückgabewert machen (was in diesem fall wohl sinnvoll wäre) mein rückgabewert sollte der Punkt mit x- und y-Koordinate sein was ist daran falsch? Code:
private static Point2D.Float einlesen()Konvneck.java [67:1] variable xKoord might not have been initialized return new Point2D.Float(xKoord,yKoord); ^ Konvneck.java [67:1] variable yKoord might not have been initialized return new Point2D.Float(xKoord,yKoord); ^ 2 errors Errors compiling Konvneck. ich verstehe schon, dass er die variablen nicht kennt -> sie existieren ja nur im try-catch-block nur weiß ich nicht wie ich das beheben könnte mfg poison |
indem du die variable ausserhalb definierst
zb. vor der while schleife mit Point2D.Float punkt = null; und dann nur mehr innerhalb des try catch blocks punkt = new Point2D.Float(xKoord, yKoord); ps: gib die variable zurück, nicht die Klasse: return punkt; |
ok so weit so gut...
nun kann ich z.b. eine neue methode schreiben wo ich diesen punkt verwende oder? z.b. private static void punkt {print (punkt);} das müsste doch funktionieren oder? bei mir geht das nämlich wieder einmal nicht :( mfg poison |
jo, das müsste funktionieren
] Code:
public void neueMethode() |
Q
ok so jetzt habe ich mal genug vom programmieren... der mensch muss ja auch noch etwas anderes tun -> z.b schlafen ;)
mfg poison ps: das ist eine von mehreren verschiedenen programmieraufgabe, die wir auf der uni lösen müssen -> der andere, der auch um hilfe gebeten hat, hat aber ein anderes beispiel als ich... ach, ja ich hoffe nciht, dass jemand jetzt vermutet ich bin so bequem und lasse mir hier die aufgabe lösen und versuche nicht selber nachzudenken -> ich gebe mir wirklich mühe und versuche auch soweit es mir möglich ist es alleine zu lösen... nur als programmieranfänger hat man es ziemlcih schwer alleine mit einem programm fertig zu werden, das fehler enthält man sieht entweder die fehler nicht oder man erkennt sie zwar aber weiß nicht wie man sie behebt deswegen bin ich dir tarjan auch wirklich sehr dankbar für deine hilfe! :) |
ist mir halt aufgefallen, da er die gleiche mutterklasse verwendet wie du
naja, aller anfang ist schwer, nicht unterkriegen lassen ;) gut nacht |
ok jetzt habe ich versucht die methode so umzuschreiben, dass die punkte in einen vector gespeichert werden und dieser vector dann zurückgegeben wird -> das macht der code auch nur wird in diesem vector nur der letzte punkt gespeichert
jetzt meine frage wo liegt der fehler? Code:
import eprog.*; |
du legst bei jeden punkt mit
Code:
punkte = new Vector();ps: bei debuggen mit variablenkontrolle fallen solche dinge auf |
gelöscht
hat sich erledigt Jak |
ok mein programm ist nun fast fertig -> nur eine kleinigkeit passt noch nicht:
wenn die eingabe nicht den regeln entspricht dann soll sofort das ganze beendet werden wie mache ich das? mfg poison |
Mir fallen zwei Möglichkeiten ein:
1. System.exit(0) oder so ähnlich 2. eine Exception werfen: Du kapselst das ganze Programm in einen try-catch Block und wirfst bei illegaler eingabe eine Exception. Mir ist 2. sympatischer. Jak |
Sind die beiden gängigen Methoden, wobei die erste Möglichkeit mit System.exit(int) zwar die einfachere, aber auch die brutalere ist, da hier die VM sofort beendet wird.
|
also wenn ich es mit System.exit(0) mache dann sollte das aber keinen wirklichen unterschied machen - ich meine vom programmablauf selbst oder?
mfg poison |
Rein vom Programmablauf gibt es nur einen minimalen Unterschied:
beim .exit verlässt du das Programm sofort, egal wo du gerade warst. Bei einem try{...throw...}catch(...){../*hier*/.} kannst du noch etwas ausführen (da wo das "hier" steht). Außerdem wandert die Exception durch alle Unterprogramme bis sie gefangen wird. Du kannst damit also erheblich mehr machen. Wenn du weiter Java oder C++ Programmieren willst solltest du dir Exceptions so oder so mal anschaun. Sie sind ziemlich praktisch. Jak |
| Alle Zeitangaben in WEZ +2. Es ist jetzt 17:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag