Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
bisher habe ich hier immer schnelle Hilfe bekommen und hoffe auf dies auch diesesmal.
Ich will folgendes machen:
1676
-8555
3565
1478
-8977
1234
Diese Zahlen sollen also durch einen Zeilenumbruch voneinander getrennt sein. Man kann diesem Zeilenumbruch an der Unicode-Zeichen-Kombination 13 und 10 erkennen. Das Minuszeichen '-' besitzt den Unicode 45. Die Ziffern 0 bis 9 werden durch die Zahlen 48 bis 57 codiert.
Methode soll Dateinamen als String bekommen und einen Array von int-Zahlen zurückgibt, das die Zahlen aus der Datei beinhaltet.
So mein bisheriger Code:
Code:
public char [] lies_Zahlen_aus(String Dateiname)
{ File Datei;
BufferedReader Leser;
Datei = new File(Dateiname);
try
{
Leser = new BufferedReader(new FileReader(Datei));
int Zahllaenge = (int)Datei.length();
char [] Daten = new char [Zahllaenge];
Leser.read(Daten,0,Zahllaenge);
Leser.close();
for(int i=0;i<Zahllaenge;i++)
{ System.out.print(Daten[i]);}
return Daten;
}
catch(IOException e)
{
System.out.println("Ein Fehler ist aufgetreten!");
return null;
}
}
Aber leider ist das ja eher nicht so richtig... ist speicher ja nix als UNI-code- irgendwie muss man es doch schaffen, die Ziffern usw.. in Unicode umzuwandeln... Brauche da mal Hilfe.
1. Wähle bitte einen entsprechenden Titel - sowas nichts sagendes wird hier gar nicht gern gesehen.
2. schreib was nicht geht.
einfache regeln des postens
zum problem:
seh ich das richtig, dass du eine datei, in der Zahlen stehen, auslesen willst und die zahlen als array zurückgeben willst ?
warum nicht einfach zeilenweise mit z.b. bufferedReader auslesen und einfach in ein int parsen ?
mache ich doch, ich kann zwar zeilenweise auslesen, muss aber unicode verwenden indem in jede stelle konvertiere in Unicode.
Ich lese ja schon Zeilenweise aus, hätte ich auch Linenumber nehmen können - muss aber als UniCode abgespeichert werden und Array muss ausgelesen werden.
Wenn Deine Methode ein int-Array zurückliefern soll, warum deklarierst Du sie dann mit dem Rückgabetyp char[]?
Auf irgendwelche Unicode- oder ASCII-Codierungen musst Du m.E. für dieses Problem überhaupt nicht zurückgreifen.
Verwende BufferedReader#readLine, um die Datei zeilenweise einzulesen (Tip: wenn die Methode null zurückliefert, ist die Datei zuende).
Die gelesenen Strings kannst Du dann mit Integer#parseInt in ints umwandeln.
Hallo, danke für eure Tips - doch muss ich mit Unicode arbeiten. Es bleibt mir also nicht anderes übrigt. Sollte ich am besten versuchen beim auslesen ne If anweisung einzubauen?
Komme da echt nicht weiter
------------------------
das char ist noch von der Methode die ich getestet hatte mit Buchstaben.
----------------
edit: Der Bufferedreader liest mir doch das ganze aus. Ich könnte ja auch nen line reader benutzten - aber das ist ja nicht Sinn und Zweck.
Wenn Du unbedingt zeichenweise lesen willst / sollst, dann nimm BufferedReader#read. Die Zeichen musst dann mit einer Fallunterscheidung (if/else) behandeln. Mal als Pseudocode:
setze merker auf 0
lies zeichen z aus Datei, bis z <0 -> dann ist die Datei zuende
wenn (z = 45) und (merker = 0) merker = -1
sonst wenn z >= 48 und z <= 57 {
wenn merker <0 merker = 10*merker - (z-48)
sonst merker = 10*merker + (z-57)
}
sonst wenn z = 10 {
merker in ergebnisliste speichern
merker = 0;
}
sonst zeichen ignorieren
Hi, danke für deinen Pseudocode. Ich werde mich gleich dran setzten und veruschen das zu coden. Werde mich bestimmt heute nochmals zu Wort melden müssen
Eine Möglichkeit: verwende beim Einlesen eine Collection, z.B. eine ArrayList. Dann fügst Du jede gefundene Zahl (verpackt in einen Integer-Wrapper) in die Liste eine:
Code:
theArrayList.add( new Integer( merker));
Am Ende kennst Du ja die Länge der Liste und kannst dann das Array konstruieren:
Code:
int[] ia = new int[theArrayList.size()];
for ( int i=0; ii<ia.length; i++) ia[i]=((Integer)(theArrayList.get( in))).intValue();
return ia;
Im Code gibt es ja eine Stelle, wo nach einem Zeilenumbruch der bis dahin aufgelaufene Wert ausgegeben und dann für die nächste Zeile wieder auf 0 gestzt wird. Da kann man das Ergebins dann "abgreifen" und in die Liste schreiben.
Und: die ArrayList deklarierst Du am besten als lokale Variable gelich am Anfang der Methode:
"pending" ist keine Funktion, sondern eine in diese Methode deklarierte Variable. Sie wird immer dann auf true gesetzt, wenn eine Ziffer oder ein Minus gefunden wird. Wenn eine ganze Zahl erkannt und in die Ergebnisliste geschrieben wurde, wird das Flag wieder auf false gesetzt. So kann man am Ende der Schleife erkenne, ob es noch eine Zahl gibt, die noch nicht in die Ergebnisliste übernommen wurde.
Bei der Behandlung er letzen Zahl hatte ich mir die Ausschreibung gespart, das kann man aber natürlich auch ändern. Und auch mit Leerzeich kann man klarkommen:
Code:
int merker = 0;
boolean neg = false;
boolean pending = false;
int z;
while ( (z = rdr.read()) > -1) {
if ( (z == 45) && (merker==0)) {
neg = true;
pending = true;
} else if ((z >= 48) && (z <=57)) {
merker = 10*merker + (z-48);
pending = true;
} else if ( z == 10) {
;
} else if ( z == 32) {
;
} else if ( z == 13) {
if ( pending) {
if ( neg) merker = merker * -1;
theArrayList.add( new Integer( merker));
System.out.println( "Zahl gefunden:" + merker);
merker = 0;
neg = false;
pending = false;
}
} else {
System.out.println( "syntax-error: z=" + z);
}
}
if ( pending) {
if ( neg) merker = merker * -1;
theArrayList.add( new Integer( merker));
System.out.println( "Zahl gefunden:" + merker);
}