# suche dringend Hilfe bei kleinem Programm



## snorkfräulein (20. Jul 2004)

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


----------



## bygones (20. Jul 2004)

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 (20. Jul 2004)

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 (20. Jul 2004)

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:


----------



## bygones (20. Jul 2004)

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 (20. Jul 2004)

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 (20. Jul 2004)

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.


----------



## snorkfrau (20. Jul 2004)

sehr geil
danke schön, da werde ich erstmal etwas herumprobieren!!!


----------



## L-ectron-X (20. Jul 2004)

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:

```
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 (20. Jul 2004)

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??


----------



## bygones (21. Jul 2004)

mhm - bin auch fan von regex:
daher:

```
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 (21. Jul 2004)

deathbyaclown hat gesagt.:
			
		

> mhm - bin auch fan von regex:
> daher:
> 
> ```
> ...





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??


----------



## bygones (21. Jul 2004)

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 (21. Jul 2004)

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:
> 
> ```
> ...





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 (21. Jul 2004)

Z.B. so, kurz und knackig:

```
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 (21. Jul 2004)

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??


----------



## snorkfrau (23. Jul 2004)

Wie könnte das ganze denn mit einem try- catch Block aussehen??


----------



## L-ectron-X (23. Jul 2004)

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 (25. Jul 2004)

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:



```
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:


```
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.


----------



## snorkfrau (26. Jul 2004)

tja und jetzt weiß ich nur nicht, wie ich das ganze zu einem funktionstüchtigen Programm zusamensetzen kann...


----------



## Isaac (26. Jul 2004)

```
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 (28. Jul 2004)

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



```
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 (29. Jul 2004)

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


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



Übrigens, zum parsen soclher Stringketten empfiehlt sich der StringTokenizer...


----------



## snorkfrau (29. Jul 2004)

So Leute, besten Dank für eure Hilfe!!!

Dat gute Ding läuft endlich.


----------

