java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Antwort    
Themen-Optionen Thema durchsuchen Ansicht
Alt 18.06.2012, 17:46   #1 (permalink)
Neuer Benutzer
byte
 
Registriert seit: 16.05.2012
Fachbeiträge: 15
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard String zerlegen

Hallo
ich möchte ein bisschen Java üben und habe mir folgende Übungsaufgabe rausgesucht.

Gegeben ist ein String mit Wörtern, die durch ein oder mehrere Leerzeichen
voneinander getrennt sind (Wort = beliebige Zeichenfolge ohne Leerzeichen). Geben
Sie eine Java-Methode woerterListe an, die aus einem solchen, als Parameter
woerter übergebenen String die einzelnen Wörter extrahiert und alle diese Wörter als
Liste zurückliefert:
LinkedList<String> woerterListe(String woerter) { ... }

mein problem ist nun das der int anfang, fest sitzt zwischen "Hallo" und "du".
ich weiß wirklich nicht, wie ich auf das nächste wort komm um es zu separieren.

gibt es vllt. auch eine elegantere Lösung, als so wie ich es probiere?


Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package Test;
import java.util.*;
 
class Test2 {
 
    public LinkedList<String> woerterListe(String woerter){
        LinkedList<String> liste1 = new LinkedList<String>();
        String hilf = " ";
        int anfang = 0;
       // int ende = 0;
        woerter = woerter.trim();
        woerter = woerter + hilf;
        while(woerter.length() > anfang){
          //  ende = woerter.indexOf("");
            hilf= woerter.substring(anfang,woerter.indexOf(" "));
            anfang = woerter.indexOf(" ");       // index von "" reinspeichern
            liste1.add(hilf);
        }
        
        return liste1;
    }
    
    public static void main(String[] args){
        Test2 run = new Test2();
        String woerter = "    Hallo du, du hast alles richtig gemacht!    ";
        LinkedList<String> liste = run.woerterListe(woerter);
        System.out.println(liste);
    }
}
Börmt-die-Buse ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 17:49   #2 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 06.01.2012
Fachbeiträge: 1.354
Abgegebene Danke: 24
Erhielt 242 Danke für 241 Beiträge
Ich glaub, du musst den Angang auf Index(Leerzeichen) + 1 setzen.
__________________
Ich bin ein Rechtschreipunk
HimBromBeere ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 17:52   #3 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Registriert seit: 02.09.2009
Fachbeiträge: 6.073
Abgegebene Danke: 24
Erhielt 1.224 Danke für 1.208 Beiträge
Musst du das so "manuell" machen? Die Klasse String kennt ne Methode split() mit der du das wunderbar lösen könntest.
__________________
jCSV - Simple CSV library for Java - http://code.google.com/p/jcsv/
Asteroid Impact - Echtzeit-Strategie-Browsergame
EikeB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:01   #4 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 26.10.2009
Fachbeiträge: 606
Abgegebene Danke: 18
Erhielt 83 Danke für 80 Beiträge
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
public LinkedList<String> woerterListe(String woerter){
  return new LinkedList<String>(Arrays.asList(woerter.split(" ")));
}
__________________
>>>Hausaufgabenhilfe<<< >>>AbGEZockt?<<<
Cola_Colin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:03   #5 (permalink)
Stammbenutzer
Halbes Gigabyte
 
Registriert seit: 02.09.2009
Fachbeiträge: 6.073
Abgegebene Danke: 24
Erhielt 1.224 Danke für 1.208 Beiträge
Wenn schon vorsagen dann aber auch richtig
Zitat: Börmt-die-Buse
[...] Wörtern, die durch ein oder mehrere Leerzeichen voneinander getrennt sind [...]
__________________
jCSV - Simple CSV library for Java - http://code.google.com/p/jcsv/
Asteroid Impact - Echtzeit-Strategie-Browsergame
EikeB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:05   #6 (permalink)
Neuer Benutzer
byte
Themenstarter
 
Registriert seit: 16.05.2012
Fachbeiträge: 15
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
mit Index(Leerzeichen) + 1 hab ich mir auch schon gedacht, dann bekomm ich aber eine
(java.lang.StringIndexOutOfBoundsException: String index out of range: -1) Exception.

wenn ich split() benutzt muss ich den string woerter zu String[] woerter setzen, weil die einzelnen Worter ja dann in Arrays gespeichert werden. Aber der Kopf der methode ist vorgegeben.
Kann es sein das split(" ") gar nicht funktionieren würde, weil es eine Reguläre Expression sein müsste?
Börmt-die-Buse ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:06   #7 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
String.split arbeitet mit Pattern und Matcher, du kannst dir das ja mal bei grepcode.com anschauen: GrepCode: java.util.regex.Pattern (.java) - Class - Source Code View
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:07   #8 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 26.10.2009
Fachbeiträge: 606
Abgegebene Danke: 18
Erhielt 83 Danke für 80 Beiträge
Hmm ja, wenn die ganzen Leerstrings stören, dann muss man es noch anpassen, hast recht:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        String test = "hallo welt    viele leeerzeichen   test";
        System.out.println(woerterListe(test));
    }
    
    public static LinkedList<String> woerterListe(String woerter){
          return new LinkedList<String>(Arrays.asList(woerter.split(" +"))); //trenne bei einem oder mehreren leerzeichen
    }
__________________
>>>Hausaufgabenhilfe<<< >>>AbGEZockt?<<<
Cola_Colin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Danke sagt:
Börmt-die-Buse (18.06.2012)
Alt 18.06.2012, 18:12   #9 (permalink)
Neuer Benutzer
byte
Themenstarter
 
Registriert seit: 16.05.2012
Fachbeiträge: 15
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Zitat: Cola_Colin
Beitrag anzeigen
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
public LinkedList<String> woerterListe(String woerter){
  return new LinkedList<String>(Arrays.asList(woerter.split(" ")));
}
dieser Code funktioniert, mit einem kleinen
Java Code: Quelltext in neuem Fenster öffnen
1
woerter = woerter.trim()
noch davor.

würde trotzdem noch gerne wissen, was ich bei meinem Code ändern müsste damit es funktioniert.
Börmt-die-Buse ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:14   #10 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
Zitat: Börmt-die-Buse
Beitrag anzeigen
dieser Code funktioniert, mit einem kleinen
Java Code: Quelltext in neuem Fenster öffnen
1
woerter = woerter.trim()
noch davor.
trim trennt nur voran- oder nachgestellte Leerzeichen ab!
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:17   #11 (permalink)
Neuer Benutzer
byte
Themenstarter
 
Registriert seit: 16.05.2012
Fachbeiträge: 15
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Zitat: hüteüberhüte
Beitrag anzeigen
trim trennt nur voran- oder nachgestellte Leerzeichen ab!
ich weiß
Börmt-die-Buse ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 18.06.2012, 18:22   #12 (permalink)
Stammbenutzer
Halbes Megabyte
 
Registriert seit: 26.10.2009
Fachbeiträge: 606
Abgegebene Danke: 18
Erhielt 83 Danke für 80 Beiträge
Für deinen originalen Code schaue dir mal diese Version von indexOf an:
String (Java Platform SE 6)
__________________
>>>Hausaufgabenhilfe<<< >>>AbGEZockt?<<<
Cola_Colin ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 19.06.2012, 08:51   #13 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 22.09.2011
Fachbeiträge: 237
Abgegebene Danke: 24
Erhielt 16 Danke für 16 Beiträge
du solltest wirklich mit split arbeiten

zu deinem Problem: anfang = woerter.indexOf(" ") sucht immer und immer wieder bei jedem Durchang der Schleife nach dem ersten vorkommenden Leerzeichen, und das steckt wohl zwischen "Hallo" und "du". Solltest also "woerter" nach dem Zuweisen von "hilf" entsprechend anpassen ...
mla.rue ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 19.06.2012, 14:16   #14 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
Zitat: Börmt-die-Buse
Beitrag anzeigen
Gegeben ist ein String mit Wörtern, die durch ein oder mehrere Leerzeichen
voneinander getrennt sind (Wort = beliebige Zeichenfolge ohne Leerzeichen). Geben
Sie eine Java-Methode woerterListe an, die aus einem solchen, als Parameter
woerter übergebenen String die einzelnen Wörter extrahiert und alle diese Wörter als
Liste zurückliefert:
LinkedList<String> woerterListe(String woerter) { ... }
Hätte das jetzt so implementiert, ohne irgendwelche Hilfsmethoden:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
22
23
24
    public static LinkedList<String> woerterListe(String woerter) {
        LinkedList<String> result = new LinkedList<String>();
        
        int i = 0;
        while (i < woerter.length()) {
        while (i < woerter.length() && woerter.charAt(i) == ' ') {
            i++;
        }
        int j = i;
        while (i < woerter.length() && woerter.charAt(i) != ' ') {
            i++;
        }
        if (i != j) {
            result.add(woerter.substring(j, i));
        }
        }
        
        return result;
    }
 
    public static void main(String[] args) {
        System.out.println(woerterListe("bla   blaa blaaa  a    "));
    }

Jetzt noch kurz zur Erklärung Kommentare:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        LinkedList<String> result = new LinkedList<String>();
        
        int i = 0;
        // i = aktuell untersuchtes Zeichen
        while (i < woerter.length()) {
        while (i < woerter.length() && woerter.charAt(i) == ' ') {
            // übergehe alle Leerzeichen
            i++;
        }
        int j = i;
        // j = Position des ersten Nicht-Leerzeichens
        while (i < woerter.length() && woerter.charAt(i) != ' ') {
            i++;
            // übergehe alle Nicht-Leerzeichen
        }
        // i = Position des ersten Leerzeichens
        if (i != j) {
            result.add(woerter.substring(j, i));
        }
        }
        
        return result;

Also drei while-Schleifen. Klar würde das auf mit for-Schleifen funktionieren:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public static LinkedList<String> woerterListe(String woerter) {
        LinkedList<String> result = new LinkedList<String>();
        
        for (int i = 0; i < woerter.length();) {
        for (; i < woerter.length() && woerter.charAt(i) == ' '; i++)
            ;
        int j = i;
        for (; i < woerter.length() && woerter.charAt(i) != ' '; i++)
            ;
        if (i != j) {
            result.add(woerter.substring(j, i));
        }
        }
        
        return result;
    }

Aber das ist mehr oder weniger Geschmackssache. Die einen bevorzugen das, die anderen das..

Grüße!
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 19.06.2012, 14:22   #15 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
Achja, ohne .substring müsstest du dir ein char[] erstellen, in das dann die einzelnen Zeichen kopiert werden. Aber denke mal, des ist auch klar
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.06.2012, 10:13   #16 (permalink)
x22
Stammbenutzer
Kilobyte
 
Benutzerbild von x22
 
Registriert seit: 18.01.2012
Fachbeiträge: 156
Abgegebene Danke: 0
Erhielt 34 Danke für 31 Beiträge
@hüte und TO

in etwa so:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
                    char[] x= a.toCharArray();
                    a= String.valueOf(x[0]);
                    eins= Integer.parseInt(a)
__________________
---------------------------------------

x22- bypassing || one man army
x22 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.06.2012, 12:58   #17 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
...das wäre ja nur ein Zeichen/Integer...:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public static LinkedList<String> woerterListe(String woerter) {
        LinkedList<String> result = new LinkedList<String>();
 
        int i = 0;
        while (i < woerter.length()) {
            while (i < woerter.length() && woerter.charAt(i) == ' ') {
                i++;
            }
            int j = i;
            while (i < woerter.length() && woerter.charAt(i) != ' ') {
                i++;
            }
            if (i != j) {
                // result.add(woerter.substring(j, i));
                char[] ca = new char[i - j];
                for (int k = 0; j < i; k++, j++) {
                    ca[k] = woerter.charAt(j);
                }
                result.add(new String(ca));
            }
        }
 
        return result;
    }

Oder:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
                // result.add(woerter.substring(j, i));
                int len = i - j;
                char[] ca = new char[len];
                for (int k = 0; k < len; k++) {
                    ca[k] = woerter.charAt(j + k);
                }
                result.add(new String(ca));

Freilich, ganz ohne zumindest den String-Konstruktor und .charAt geht es nicht...
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.06.2012, 13:15   #18 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
ok, hab mal nachgesehen, was bei .substring passiert:

GrepCode: java.lang.String (.java) - Class - Source Code View

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.%3Cinit%3E%28int%2Cint%2Cchar[]%29

Es wird ein package private constructor aufgerufen, der mit demselben char[] (Referenz wird kopiert) ein neues String-Objekt erstellt/instantiiert. Das geht ja, weil sich das char[] nicht ändern darf.
Es werden also keine Zeichen kopiert. Damit sollte .substring schneller sein, als ein neues char[] zu erstellen

Geändert von iKnwWhtUDidLast (20.06.2012 um 13:21 Uhr)
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.06.2012, 13:36   #19 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 20.06.2012
Fachbeiträge: 246
Abgegebene Danke: 2
Erhielt 35 Danke für 35 Beiträge
Noch eine Lösung wäre:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   /**
    * Liefert die einzelnen Wörter aus einem String (BETA).
    * @param woerter
    * @return
    */
   public static LinkedList<String> woerterListe(String woerter) {
      LinkedList<String> liste1 = new LinkedList<String>();
      String wort = "";
      for (char c : woerter.toCharArray()) {
         if (c == 32) {
            if (wort.length() != 0) {
               liste1.add(wort);
               wort = "";
            }
         } else {
            wort += c;
         }
      }
      if (wort.length() != 0) {
         liste1.add(wort);
      }
      return liste1;
   }
ssoul26 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 20.06.2012, 13:41   #20 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 21.02.2012
Fachbeiträge: 1.614
Abgegebene Danke: 315
Erhielt 230 Danke für 223 Beiträge
Eyi, des arbeitet mit StringKonkatenation , evil
iKnwWhtUDidLast ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
System.out auf files umlenken in log4j.xml jmar83 Allgemeine Java-Themen 4 18.01.2011 17:45
JSF Custom Component ValueExpression wird nur als String erkannt JackBuuBuu Web Tier 2 18.12.2009 09:31
irc bot noch nicht geregt Netzwerkprogrammierung 9 08.07.2006 11:28
JList mit Mausklick auf einen JButton scrollen Negr0 Allgemeine Java-Themen 28 31.03.2005 02:17
schwieriger String für StringTokenizer, wie am Besten ? spidermobile Java Basics - Anfänger-Themen 8 30.03.2005 19:36


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:42 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de