suche dringend Hilfe bei kleinem Programm

Status
Nicht offen für weitere Antworten.
S

snorkfräulein

Gast
Hallo ihr Lieben,

ich brauche dringend mal Eure Hilfe.

Wir mußten für die Uni ein Java Programm schreiben, welches verschiedene Daten mit Hilfe von Support Vector Machines in verschiedene Klasse einteilt und diese Einteilung am Ende auch graphisch ausgibt.
Das läuft auch soweit.

Problem ist jetzt nur, dass noch überprüft werden muss, ob die Daten anfangs auch richtig eingelesen werden, sprich man soll testen, ob sie nur aus Zahlen bestehen oder ob auch Buchstaben vorkommen, ob sie das richtige Format aufweisen oder ob mehr als zwei Dimensionen vorhanden sind usw.

Falls irgendetwas davon zutrifft, stürzt momentan das ganze Programm ab, was ziemlich nervig ist. Statt dessen soll halt eine Fehlemeldung angezeigt werden, damit man die eingegebenen Daten nochmal überprüfen kann.

Ich hab grade überhaupt keine Idee, wie ich das umsetzen soll und wäre superfroh, wenn mir hier jemand vielleicht wenigstens einen kleinen Ansatz vorschlagen könnte oder eine grobe Idee, wie man sowas gestalten kann.

Liebe Grüße
 
B

bygones

Gast
hihi - ehrlich ich finde es immer lustig wenn ich sehe was für programme geschrieben werden und dann an "man-denkt" simplen Problemen scheitert (SVM sind ja nicht wirklich ohne...)

Wie liest du die daten ein - was soll passieren wenn was falsches kommt (abbruch, fehlermeldung) - ist das alles dann schon grafisch oder soll fehler auf konsole ausgegeben werden ?
 

DP

Top Contributor
die zu prüfende nummer schiebst du in einem try-block in eine numerische variable und fängst im catch-block eine numberformatexception auf.

die wird dann geworfen wenn es sich um keine gültige zahl handeltl.

den fehler kannst du dann in der console ausgeben.

cu
 

Isaac

Bekanntes Mitglied
Ich wusste bis gerade nicht mal was das ist. Hört sich aber hoch interesant an. so viel das man lernen könnte und so wenig Zeit :cry:
 
B

bygones

Gast
Isaac hat gesagt.:
Ich wusste bis gerade nicht mal was das ist. Hört sich aber hoch interesant an. so viel das man lernen könnte und so wenig Zeit :cry:
mhm - aus eigener Erfahrung kann ich dir SVM anraten... sind lustig und alles andere als einfach zu verstehen :wink:
 

snorkfrau

Mitglied
deathbyaclown hat gesagt.:
hihi - ehrlich ich finde es immer lustig wenn ich sehe was für programme geschrieben werden und dann an "man-denkt" simplen Problemen scheitert (SVM sind ja nicht wirklich ohne...)

Wie liest du die daten ein - was soll passieren wenn was falsches kommt (abbruch, fehlermeldung) - ist das alles dann schon grafisch oder soll fehler auf konsole ausgegeben werden ?

Also die Daten werden über eine bereits programmierte Oberfläche eingelesen. man kann sie entweder direkt per Hand eingeben oder eben aus einem Ordner laden. Das Problem ist halt, dass möglichst nur Zahlen eingelesen werden sollen und wenn da halt noch Buchstaben oder so vorkommen, soll sich praktisch ein neues Fenster öffnen, welches eine Fehlermeldung anzeigt, so dass der Benutzer sofort weiß, dass mit seinen Daten was nicht in Ordnung ist.

CU
Snorkfrau
 

Isaac

Bekanntes Mitglied
Na wenn deine Daten nicht zu lang sind ist das doch eine Sache die man mit Regular Expressions sauber und schnell lösen kann.

Eine gute Seite wo das Schritt für Schritt erklärt wird.
http://www.regenechsen.de/regex_de/regex_bsp_de.html

In Java gibts dann eine Unterstützung für eben diese Expressions die man direkt auf den eingelesenen String anwenden kann.
 

L-ectron-X

Gesperrter Benutzer
Also wenn ich das nun richtig interpretiert habe, geht es darum, nach Eingabe bzw. Einlesen von Zeichen (Strings) nur dann eine Weiterverarbeitung zuzulassen, wenn im String bzw. der Eingabe nur Zahlen enthalten sind. ???:L Ja?
Dann könnte man das so lösen:
Code:
String str;
//Eingabe in str speichern
...
//Auf Zeichen/Buchstaben prüfen
for(int i = 0; i < str.length(); i++) {
  if(Character.isLetter(str.charAt(i))) {
    //einen Dialog öffnen oder einen Hinweis ausgeben,
    //das in der Eingabe ein Buchstabe enthalten ist
  }
}
 

snorkfrau

Mitglied
dank Dir,
das sieht ziemlich gut aus.
Muss ich ungefähr genauso vorgehen, wenn ich die Daten auf Format bzw. auf Dimensionen überprüfen will??
 
B

bygones

Gast
mhm - bin auch fan von regex:
daher:
Code:
String zahl = "12345";
String zeichen = "abcer";
System.out.println(zahl.matches("[0-9]+")); // ergibt true
System.out.println(zeichen.matches("[0-9]+")); // ergibt false
wegen format und dimension... klar kannst du das auch überprüfen - hängt aber davon ab was du mit format und dimension meinst (dimension = länge der Eingabe ? dann zahl.length()).....
 

snorkfrau

Mitglied
deathbyaclown hat gesagt.:
mhm - bin auch fan von regex:
daher:
Code:
String zahl = "12345";
String zeichen = "abcer";
System.out.println(zahl.matches("[0-9]+")); // ergibt true
System.out.println(zeichen.matches("[0-9]+")); // ergibt false
wegen format und dimension... klar kannst du das auch überprüfen - hängt aber davon ab was du mit format und dimension meinst (dimension = länge der Eingabe ? dann zahl.length()).....



Das ganze soll halt zweidimensional dargestellt werden mit x- und y Werten. Dementsprechend dürfen halt auch die eingegebenen Daten dann nicht plötzlich drei Dimensionen oder nur eine aufweisen.
Aber wie kann ich das nun wieder überprüfen??
 
B

bygones

Gast
snorkfrau hat gesagt.:
Aber wie kann ich das nun wieder überprüfen??
Sorry - aber da gibt es keine pauschal antwort.
Wenn sie wie du sagst über eine Oberfläche eingelesen werden dann würde ich die Oberfläche so gestalten dass nur 2 dims eingegeben werden können.
Kommen sie aus einem File ist es abhängig wie sie im File stehen....

ich würde einfach (doch als pauschal antwort): les die Daten ein und nimm einfach nur die ersten beiden Werte.... gibt es mehr werte übersiehst du die entweder oder beschimpfst den User :lol:
 

snorkfrau

Mitglied
L-ectron-X hat gesagt.:
Also wenn ich das nun richtig interpretiert habe, geht es darum, nach Eingabe bzw. Einlesen von Zeichen (Strings) nur dann eine Weiterverarbeitung zuzulassen, wenn im String bzw. der Eingabe nur Zahlen enthalten sind. ???:L Ja?
Dann könnte man das so lösen:
Code:
String str;
//Eingabe in str speichern
...
//Auf Zeichen/Buchstaben prüfen
for(int i = 0; i < str.length(); i++) {
  if(Character.isLetter(str.charAt(i))) {
    //einen Dialog öffnen oder einen Hinweis ausgeben,
    //das in der Eingabe ein Buchstabe enthalten ist
  }
}



Wie kann ich denn so einen Dialog noch gleich erstellen?? so dass sich halt ein neues Fenster öffnet??
Im Moment hab ich echt vor lauter programmieren voll das Brett vor'm Kopf...
 

L-ectron-X

Gesperrter Benutzer
Z.B. so, kurz und knackig:
Code:
JOptionPane.showMessageDialog(this,"Im eingelesenen Datenmaterial sind Buchstaben enthalten!\nBitte überprüfen Sie Ihre Eingabe!", "Warnung", JOptionPane.WARNING_MESSAGE);
So, oder so ähnlich schreibst Du's einfach an die Stelle im Code, an der der Dialog aufgerufen werden soll.
 

snorkfrau

Mitglied
So und jetzt hab ich nochmal 'ne ganz dumme Frage...

Soll ich die Daten am besten mit FileReader einlesen oder wie???
Und muss ich beim Einlesen irgendwas wichtiges beachten??
 

L-ectron-X

Gesperrter Benutzer
Kannst Du mal noch sagen, was für Daten das sind, die Du einlesen möchtest? Ich denke, dann traut sich auch wieder jemand ran. :wink:
 

snorkfrau

Mitglied
L-ectron-X hat gesagt.:
Kannst Du mal noch sagen, was für Daten das sind, die Du einlesen möchtest? Ich denke, dann traut sich auch wieder jemand ran. :wink:


Also die Daten sollen vom Aufbau pro Zeile so aussehen:

1 1:0.1 2:0.3 und das eben für beliebig viele Zeilen.


Ich hab mir das ungefähr so gedacht:

die Daten einlesen mit dem BufferedReader, etwa so:


Code:
try{

    BufferedReader in=new BufferedReader (....)
            line=in.ReadLine()
            while (line=null) {
dann eine try- catch Anweisung, um zu schauen, ob wirklich nur Integer bzw. Double Werte eingegeben worden sind, ungefähr so:

Code:
try{

    1.Eintrag=Integer.parseInt(...)
    2.Eintrag=Double.parseDouble(...)

    }
    catch{
und hier soll ein Fenster aufgehen, wenn ein Fehler aufgetreten ist, also if error=true


dann muss noch die Dimension überprüft werden, vielleicht am besten wieder mit 'ner Try- Catch Anweisung und 'nem Tokenizer.
Und hier dürfen eben nicht mehr als vier Tokens auftreten, ansonsten ist die Eingabe wieder falsch und es soll ebenfalls wieder ein Fenster aufgehen, welches eine Fehlermeldung anzeigt.
 

Isaac

Bekanntes Mitglied
Code:
try{ 

    BufferedReader in=new BufferedReader (....) 
            line=in.ReadLine() 
            while (line=null) {

Ich hab irgendwie das Gefühl als wenn du dir alles machen lassen willst. Alleine der Code oben.
while führt eine Anweisung aus solange Die Anweisung in der Klammer true ist.

while(true) läuft also quasi für immer. Was macht while(line= null)? Das kompiliert nicht mal da line=null kein boolscher Ausdruck ist. Selbst wenn man es richtig schreibt "line == null" wird die Anweisung nie ausgeführt da im Idealfall line ja nicht gleich null ist nach deiner ersten Readline Anweisung.

Poste mal dein komplettes Programm und dann schildere deine Problem im Detail und nicht "macht mir mal was aus dem Mumpitz den ich da gepostet habe".
 

snorkfrau

Mitglied
ok ok, also hier ein Teil des Programms...


Code:
import java.io.*;
import java.util.*;
	public class test {


	try{
      BufferedReader br = new BufferedReader(new FileReader("test.txt"));
      String zeile;
      while( (zeile=br.readLine())!= null ) {
          try{
              double x1 = Double.parseDouble(zeile.substring(zeile.indexOf("1:")+2, zeile.indexOf("1:")+10));
              double x2 = Double.parseDouble(zeile.substring(zeile.indexOf("2:")+2, zeile.indexOf("2:")+10));
          }
          catch(IOException e) { /*Fehler*/}
      }

      br.close();
    }
    catch(FileNotFoundException e) {/*Fenster mit fehlernachricht "Datei nicht gefunden"*/ }
    catch(IOException e){/*Fehler*/ }

}


hiermit möchte ich die Daten einlese, die folgendermaßen aussehen:

1 1:0.1 2:0.3 und das eben für beliebig viele Zeilen.

Und mit der Try- Catch Anweisung, wollte ich testen, ob auch wirklich nur Zahlenwerte eingelesen worden sind,
aber ich bekomme immer wieder Fehlermeldungen beim Kompilieren, dass irgendwas mit der Try- Anweisung nicht stimmt und das anscheinend noch irgendwo eine Variable fehlt.
Ich hab aber leider keine Ahnung, was genau falsch ist.
 

meez

Top Contributor
Wie wärs mit einem Methodenrrumpf??
Zudem muss das so aussehen:

Code:
} catch(FileNotFoundException e) {
/*Fenster mit fehlernachricht "Datei nicht gefunden"*/ 
 } catch(IOException e){/*Fehler*/ }



Übrigens, zum parsen soclher Stringketten empfiehlt sich der StringTokenizer...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben