# int wert = Integer.parseInt(zeile);



## angie (17. Jan 2009)

Hallo!

Ich habe mal eine kleine Frage!
Ich soll aus einem String 2 Zahlen einlesen!

Die Datei sieht beispielsweise so aus:

134546  399
234567  6999

Bislang habe ich dieses:


```
BufferedReader tmp = new BufferedReader(new FileReader(datei));
String zeile = tmp.readLine();
```

Ich weiß, dass man wie folgt eine Zahl aus einem String lesen kann:


```
int zahl = Integer.parseInt(zeile);
```

Greife ich damit auf die 1.Zahl zu?
Wenn nein, wie kann ich genau auf die 1. und die 2.Zahl eines Strings darauf zugreifen??

Vielen Dank schon mal im Voraus!!

Angie



[/code]


----------



## Gast (17. Jan 2009)

```
String input = "120, 25";
Pattern p = Pattern.compile("[+-]?[0-9]+");
Matcher m = p.matcher(input);

while ( m.find() ) {
    System.out.println(input.substring(m.start(), m.end()));
}
```

Sagt die Uni Köln dazu:
http://www.uni-koeln.de/rrzk/kurse/unterlagen/java/javaref/regex/index.htm


----------



## angie (17. Jan 2009)

Hhmm!
Sieht recht kompliziert aus!!?

Ich habe gerade noch etwas anderes entdeckt!
Könnte man dies auch wie folgt machen:


```
int zahl1 = Integer.parseInt(zeile, 1); // Liest die 1.Zahl eines Strings
int zahl2 = Integer.parseInt(zeile,2);  // Liest die 2.Zahl eines Strings
```

Könnte mir jemand sagen,ob dass so richtig ist und auch funktioniert??


----------



## 0x7F800000 (17. Jan 2009)

jetzt erzähl mir aber nicht, du hättest dir vorher in der API durchgelesen, was die methode tut :roll:
API
Jetzt kannst du zwar weitere Versuche unternehmen, eine ganze zahl 1-adisch zu entwickeln, aber ich garantiere: allzuweit wirst du da nicht kommen mit dem Ansatz.
Ohne regex geht es da halt nicht. Woher soll denn die Integer-klasse sonst wissen, wie sie deine eingabe aufteilen soll. Dieses leerzeichen mitten im String kann ja sonst auch alles mögliche meinen, etwa "10 000 000" für 10 Millionen o.ä. das kann die Integer Klasse doch nicht erraten.

Aber statt explizit einen matcher zu erzeugen, könntest du auch String.split("[^0-9]+"); oder ähnliche Konstruktionen benutzen.


----------



## Fu3L (17. Jan 2009)

angie hat gesagt.:
			
		

> Könnte mir jemand sagen,ob dass so richtig ist und auch funktioniert??



Im Zweifelsfall: Kompilieren und wenns ohne Beanstandung kompiliert, ausführen. Wird keine Exception geworfen und das richtige Ergebnis kommt raus, wirds wohl funktionieren  :wink: 

und nein, es wird so nich funktionieren. Das würde einmal einen String im Unären (falls es sowas gibt^^) und einmal im binären Zahlensystem erwarten und daraus eine Zahl im Dezimalsystem machen^^


----------



## hdi (17. Jan 2009)

Du liest zeilenweise ein und nutzt dann die Methode String#split.
Sie teilt dir einen String nach einem bestimmten Muster in mehrere Strings (liefert ein String-Array zurück).
Aufrufen tut man die Methode mit einer sog. RegEx (reglärer Ausdruck), siehe dazu:

http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#sum

Bei dir wäre der Ausdruck nachdem geteilt werden soll wohl ganz einfach ein (oder beliebig viele) Leerzeichen


----------



## Templon (17. Jan 2009)

Nene so wie du das machst geht das nicht =) Das 2te Argument für die parseInt() Methode ist der Radix.

Edit: Oh, da war ich aber viel zu langsam  :?


----------



## 0x7F800000 (17. Jan 2009)

Fu3L hat gesagt.:
			
		

> Das würde einmal einen String im Unären (falls es sowas gibt^^) und einmal im binären Zahlensystem erwarten und daraus eine Zahl im Dezimalsystem machen^^


bzzzzt :!: , falsch. Intern wird eh alles binär gespeichert.


----------



## Fu3L (17. Jan 2009)

Andrey hat gesagt.:
			
		

> Fu3L hat gesagt.:
> 
> 
> 
> ...



Stimmt  :? Aber ihr wisst ja was ich meine  :wink:


----------



## angie (17. Jan 2009)

Also irgendwie werde ich aus dem ganzen nicht schlau!

Was bedeutet denn z.B. bei Folgendem der Ausdruck in der Klammer:


```
String.split("[^0-9]+")
```

Wie genau greife ich dann mit dem "regex" auf meine 2 zahlen zu??
Habe von dem ganzen hier noch nie was gehört!

Danke schon mal!!


----------



## 0x7F800000 (17. Jan 2009)

angie hat gesagt.:
			
		

> Habe von dem ganzen hier noch nie was gehört!


Wenn du überhaupt irgendwas mit java oder überhaupt programmierung zu tun haben willst, dann kommst du da nicht drumherum. Die ersten 3-4 Google Treffer zu stichworten "java regex" und die hier geposteten Links sollten für den Überblick reichen, und konkrete details barucht man da eigentlich auch nicht auswendig zu lernen, wenn man weiß, wo man danach suchen muss.

"[^0-9]+" akzeptiert alle nichtleere zeichenketten, die keine ziffern beinhalten. In deinem konkreten fall könnte man noch zig tausend sachen hinschreiben, etwa:
"\\p{Blank}+" oder " +" oder vielleicht sogar einfach nur " " solange du garantieren kannst, dass da wirklich immer nur ein leerzeichen dazwischen ist.


----------



## hdi (17. Jan 2009)

Wie mein Vorredner schon sagte, lies erstmal das:

http://de.wikipedia.org/wiki/Regulärer_Ausdruck

Das hat ja soweit nix mit Java zu tun. 
Aber es gibt halt diese vordefinierte Methode split() auf Strings, die einen String zerlegen kann,
anhand eines regulären Ausdrucks.

Die Methode analysiert dann den String, auf dem sie aufgerufen wurde, mit der
ihm übergebenen RegEx.

Und zurückliefern tut sie dir eben ein Array von Strings (du weisst ja was ein Array ist, oder?)
indem das Ergebnis der Anwendung deines Ausdrucks enthalten ist. Also eben die Elemente 
der Menge, die sich durch die RegEx bilden lässt.

Vereinfacht gesagt bedeutet also


```
String[] stringArray = meinString.split(regEx)
```

nichts weiter als: Suche in "meinString" nach dem Ausdruck (Zeichen für Zeichen, beginnend vom Anfang des Strings), der durch "regEx" definiert ist, und immer wenn du diesen Ausdruck findest, nimm alles was du bisher angeschaut hast,
schneid es vom Rest ab, speicher es, und mache dann weiter. Alle abgeschnittenen Teilstrings sind dann in "stringArray".


----------

