Die Registrierfunktion wurde aufgrund von Spamattacken deaktiviert. Wer einen Account registriert haben möchte, sendet bitte eine E-Mail mit Wunschbenutzernamen und Wunschpasswort an die Administration. Vielen Dank!
Der nächste Themenabend im ALIEN.DE - Chat: Derzeit kein Themenabend geplant
|
|
 |
JAVA-String hack |
sohar
Übersetzer
  

Dabei seit: 31.08.2007
Beiträge: 1.727
Herkunft: Weltraum Erstmalige Anmeldung: 31.08.2007
 |
|
Ich habe einen Text in JAVA in einen String gesetzt, der heißt text.
Mein Vorhaben:
Ich will aus dem String, bei dem es sich um einen deutschen Text handelt, alle Wörter heraussieben, die mit großem Buchstaben anfangen. Diese setzt ich, falls sie dort noch nicht drinne sind, in eine HashMap, wobei jedes Wort einen Index kriegt.
Hier der Code, drunter stelle ich dann die Frage:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
int i=1;
HashMap<Int, String> hm = new HashMap<Int, String>;
for(e : text){
if(e.startsWith("A") | e.startsWith("B") | ... | e.startsWith("Z")){
if(hm1.containsValue(e)){
hm.put(i, e);
i++;
}
}
}
|
|
Frage:
if(e.startsWith("A") | e.startsWith("B") | ... | e.startsWith("Z")){
ist irgendwie nicht elegant. Ich habe ewig kein JAVA mehr programmiert, ich habe in der Referenz auch die Datenstruktur "String" nachgeschaut, hab' aber dennoch keinen Plan,wie ich das eleganter lösen könnte.
...diejenigen, bei denen es weihnachtet, mögen meinen Post natürlich bis nach dem Fest ignorieren
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von sohar: 24.12.2011 17:19.
|
|
24.12.2011 17:18 |
|
|
Geek
Erst kurz hier

Dabei seit: 10.02.2010
Beiträge: 13
 |
|
Die (Anfangs)Buchstaben sind ja char. Ein char kann auch als int-Wert repräsentiert werden.
Wenn ich mich nicht irre, dann sind alle Großbuchstaben aufeinander folgende Zahlen sprich n bis (n+26).
Nun nimmt man eine for-Schleife und geht einmal den Zahlenbereich von n bis n+26 durch.
Sollte es Lücken geben, oder Ausnahmen, dann nimmt man halt ein int-Array. Wenn man aber ein Array nimmt, dann kann man eigentlich schon ein char Array geben über das hinwegiteriert wird. ( char[] cArr = { 'A',...,'Z' } )
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
int i=1;
HashMap<Int, String> hm = new HashMap<Int, String>;
for(e : text){
for( int j = ANFANGSWERT; j < ENDWERT; ++j )
{
if( e.startsWith( (char) i ) )
{
hm.put(i, e);
++i;
}
}
//...
|
|
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Geek: 24.12.2011 22:51.
|
|
24.12.2011 22:24 |
|
|
Geek
Erst kurz hier

Dabei seit: 10.02.2010
Beiträge: 13
 |
|
Hier bietet sich die Split Methode an, die von der String-Klasse angeboten wird.
Gehandhabt wird das so:
| code: |
1:
2:
3:
4:
5:
6:
7:
|
String ursprungsString = "Das ist ein String.";
String[] neuerString= ursprungsString.split(" ");
|
|
Der Inhalt von neuerString wäre dann { "Das", "ist", "ein", "String." }.
Wobei dann die Satzzeichen mit an den Einzelstring geheftet sind und dein Text vermutlich auch Satzzeichen enthalten wird.
Daher bietet es sich an statt der Angabe des Leerzeichens ( " " ), eine sogenannte RegularExpression (RegEx) zu verwenden.
Wenn ich mich nicht irre, dann müsste das mit den RegularExpressions dann so aussehen:
| code: |
1:
2:
3:
4:
|
String satz = "Das ist ein Satz, mit Komma.";
String[] s = satz.split("[\\W]");
|
|
Edit:
Mit ANFANGSWERT meinte ich eigentlich den Wert 65 (für A) und mit Endwert den Wert 91 ( da 90 Z ist).
Sonst reicht in der for-Schleife " j = 0; j < caplet.length; ++j ".
Wobei caplet.length besser ist, da d ja z.B. dein Array um Ü,Ä,Ö erweitern könntest, oder um andere Großbuchstaben aus anderen Sprachen. Und dann sparst du dir das Anpassen des Quelltextes an zwei Stellen.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Geek: 25.12.2011 01:52.
|
|
25.12.2011 01:38 |
|
|
Alien Buster
Roswell Experte
   

Dabei seit: 03.07.2006
Beiträge: 784
 |
|
split("[\\W]") teilt Wörter mit Umlauten aber nicht korrekt.
Großschreibung würde ich persönlich prüfen mit:
| code: |
1:
2:
3:
4:
5:
6:
|
if (wort.length() > 0 &&
wort.charAt(0) == Character.toUpperCase(wort.charAt(0)) &&
wort.charAt(0) != Character.toLowerCase(wort.charAt(0)))
{
// Großschreibung
} |
|
Das spart das Anpassen des caplet Arrays unabhängig von der Sprache.
__________________

|
|
25.12.2011 05:09 |
|
|
sohar
Übersetzer
  

Dabei seit: 31.08.2007
Beiträge: 1.727
Herkunft: Weltraum Erstmalige Anmeldung: 31.08.2007
Themenstarter
 |
|
| code: |
1:
2:
3:
4:
5:
|
if (wort.length() > 0 &&
wort.charAt(0) == Character.toUpperCase(wort.charAt(0)) &&
wort.charAt(0) != Character.toLowerCase(wort.charAt(0)))
|
|
--> Das finde ich genial! So kann man das tatsächlich super elegant lösen.
|
|
25.12.2011 07:50 |
|
|
Geek
Erst kurz hier

Dabei seit: 10.02.2010
Beiträge: 13
 |
|
| Zitat: |
Original von Alien Buster
split("[\\W]") teilt Wörter mit Umlauten aber nicht korrekt.
|
Huch stimmt ja.
Dann muss statt "[\\W]" folgendes in die Klammern "[^a-zA-ZÄÖÜäöüß0-9]"
|
|
25.12.2011 12:28 |
|
|
l0tex
Erst kurz hier


Dabei seit: 15.09.2008
Beiträge: 408
 |
|
Bisschen kompliziert, denke ich.
Dafür hat sich mal jemand Regexen ausgedacht.
Hab auch schon ewig kein Java mehr in den Fingern gehabt, aber ein Regex in der Form "\b([A-Z][a-z]+)\b" o.ä. sollte dir eine Collection liefern die du weiterverarbeiten kannst.
|
|
26.12.2011 12:36 |
|
|
sohar
Übersetzer
  

Dabei seit: 31.08.2007
Beiträge: 1.727
Herkunft: Weltraum Erstmalige Anmeldung: 31.08.2007
Themenstarter
 |
|
Danke alk, Regex ist natürlich noch cooler.
| code: |
1:
2:
|
import java.util.regex.*; |
|
|
|
26.12.2011 13:33 |
|
|
|
|
|
 |
Impressum
|