Java - Wörter in String zählen
Hallo Leute ;-)
Ich habe ein kleines Java Programm zu schreiben, mit dem ich Wörter in einem eingegebenen String zählen soll. Mein erster Versuch zählte einfach die Leerzeichen und addierte zum Schluss eins. Diese Methode geht aber davon aus, das ein komplett korrekter Satz eingegeben wird, und keine Doppelleerzeichen oder sonstiges vorkommen.
Jetzt hat mir ein Freund eine neue Möglichkeit gezeigt, die zwar funktioniert, ich sie aber nicht verstehe ;-D Es wäre cool wenn ihr mir das Schritt für Schritt erklären könntet was hier genau passiert.
package Bsp2;
import java.util.Scanner;
public class Bsp2
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.print("Bitte geben Sie einen Satz ein: ");
String Satz = sc.nextLine();
System.out.print("Die Anzahl der Wörter beträgt: " + zähler(Satz));
}
public static int zähler(String Satz) {
return Satz == null ? 0 : Satz.trim().split("\\s+").length;
}
}
Wenn ich jedoch einen leeren String eingebe gibt er mir "1" zurück. Also was heißt dieses "== null ? 0 :", was macht "Satz.trim().split().length", was bedeutet "\s+".
Ich danke im vorraus ;D
Glg SynapSis
2 Antworten
Das \s ist ein regulärer Ausdruck für Leerzeichen (bzw. Whitespace), das + dahinter bdeutet mindestens eines und beliebig viele, ein Stern würde keines oder beliebig viele bdeuten. trim() scheidet am Anfang und Ende des Strings Leerzeichen ab, split() teilt den String in Einzelstrings auf, wobei der reguläre Ausdruck das Trennzeichen der Einzelstrings definiert. Length() zählt die Einzelstrings, was du ja willst.
Würdest du der Zähler-Methode (Umlaute sollte man besser nicht in Namen verwenden) anstelle eines Stringobjects null übergeben gäbe es eine Assertion, davor schützt der erste Teil mit dem ?.
Ich finde das hier recht gut, da kann man schön rumspielen und ausprobieren:
Und hier noch ein kleiner Überblick was es so alles gibt:
http://www.vogella.com/articles/JavaRegularExpressions/article.html
Der Springende Punkt ist die Funktion zähler.
return Satz == null ? 0 : Satz.trim().split("\s+").length;
Das bedeutet:
Wenn Satz null(Ein nicht definiertes Objekt) ist, dann liefere 0 zurück, andernfalls liefere die Anzahl der Unterstrings zurück, die man erhält, wenn man eine speziell behandelte(trim entfernt soweit ich weiß am Anfang und am Ende des Satzes alle Leerzeichen und ersetzt die in der mitte mit...anscheinend"\s+") Kopie von Satz an jeder Markierung "\s+" zerschneidet.
Du solltest diese Funktion NICHT verwenden, da du sie 1. nicht selbst geschrieben hast und 2. gar nicht genau weißt, was sie tut.
Hier noch einmal eine Erklärung, was null ist:
Wenn du eine Variable verwenden willst, muss ihr immer ein Wert zugewiesen sein. Primitive Datentypen haben dabei den Standardwert 0 (Bytes alle leer) und Objekte haben als Standardwert null(Im Speicher wird als Platzhalter 0 als Adresse des Objekts verwendet, das nennt man NullPointer).
NullPointer haben keine Elementfunktionen oder Variablen, ein versuch diese aufzurufen endet immer mit einer NullPointerException.
String a=null;
a.length();//NullPointerException
Dein Freund benutzt diesen Abschnitt Satz == null ? 0 :
wahrscheinlich für den Fall, dass sc.nextLine();
aus irgendeinem Grund null zurückliefert, dass das passieren kann, ist mir aber neu.
Wo findet man denn was zu diesen regulären Ausdrücken? Ich komme immer durcheinander, wenn die jemand verwendet.