In einem String alle Eigennamen zählen

Andy_93

Mitglied
Hallo zusammen,

ich bin gerade dabei Java zu lernen und habe als Aufgabe bekommen einen englischen Text einzulesen und aus diesem alle Eigennamen und ihre jeweilige Häufigkeit zu speichern.

Folgende Reihenfolge für die Bearbeitung habe ich mir überlegt:
1. Text einlesen
2. Text so splitten, dass jedes Wort in einem String[] array gespeichert wird (mithilfe der .split()-Methode)
3. Durch den String[] array mit einer Schleife durchlaufen und dabei mit Hilfe eines RegEx (Regular Expression) prüfen, ob ein Wort überhaupt ein Eigenname ist, also mit einem Großbuchstaben beginnt. Außerdem muss ich ja darauf achten, dass nicht jedes groß geschriebene Wort ein Eigenname ist (z. B. das erste Wort am Satzanfang).
4. Ist ein Eigenname gefunden, diesen zuordnen und seine bisherige Häufigkeit um 1 erhöhen.

Die ersten 2 Schritte habe ich. Ich frage mich jetzt jedoch, wie ich alle Bedingungen im RegEx beachte und wie ich einen Eigenname so speichere, dass er bei einer Wiederholung um 1 erhöht wird.

Ich hoffe auf tatkräftige Unterstützung und Ideen :)
 

Robat

Top Contributor
Für die Häufigkeit würde ich auf eine Map setzen wo du als Key den String hast und als Value, als int, die Anzahl der Vorkommen.

Zur Überprüfung würde ich kein Regex nehmen sondern mir immer nur den ersten Buchstaben des Strings anschauen (charAt) und prüfen ob es ein Großbuchstabe ist (Character#isUpperCase).
Ich würde auch nicht gleich am Leerzeichen splitten sondern erstmal die Sätze abtrennen (am Punkt splitten) und dann jeden Satz für sich bearbeiten. So kannst du leichter prüfen welches Wort am Anfang des Satzes steht.
 

Andy_93

Mitglied
Vielen, vielen Dank für Deine Antwort, Robat.

Dass es für meine Frage auch das Prinzip der Map gibt bzw. funktioniert, wusste ich bisher nicht. Ich habe mich aber über die Maps mal schlau gemacht und gelesen, dass es zwei verschiedene Maps gibt: TreeMap und HashMap. Ich denke, dass Du die HashMap meinst? Auf sie kann ich das übertragen, was Du mit dem String als Key und der Häufigkeit als Value meinst. Ist es dabei auch richtig, dass - so gesehen - jeder Eigennamen eine eigene ID bekommt, und wenn sich dann ein Eigenname wiederholt, die HashMap merkt, dass es das selbe Wort ist und entsprechend das bisherige Vorkommen um 1 erhöht?

Ich werde also zunächst an jedem Satzende (Punkt) splitten. Wenn ich dann jeden Satz einzeln berücksichtigen soll, würde ich jeden Satz dann in einzelne Worte splitten, sie in einem String[] Array speichern und ab dem zweiten Wort mit der Schleife beginnen (also an Position 1 des String[] Array)?

Statt des RegEx die Methode "isUpperCase" zu verwenden, ist gut. Sie gibt ja einen Boolean als Ergebnis zurück, der "True" ist, wenn das einzelne Wort mit einem Großbuchstaben beginnt. Nur dann soll ja das Wort in die HashMap aufgenommen werden. Also wäre das die Bedingung, die zu prüfen ist, bevor das Wort in die HashMap aufgenommen wird?
Sofern diese Bedingung erfüllt ist, muss man noch prüfen, wie ich nachgelesen habe, ob das Wort bereits in der HashMap enthalten ist. Dies kann ich mit der Methode "containsKey()" machen, oder? Anschließend kann ich das Wort entweder mit "put()" inzufügen oder es um eins erhöhen?

Was mir noch nicht ganz klar ist, ist wie ich mit der Map am Ende jedes Wort und seine Häufigkeit ausgeben kann. Kannst Du mir das bitte noch erläutern. :)
 

Robat

Top Contributor
Ja genau ich meine HashMap ;)
die Methode "isUpperCase" zu verwenden, ist gut. Sie gibt ja einen Boolean als Ergebnis zurück, der "True" ist, wenn das einzelne Wort mit einem Großbuchstaben beginnt.
Nicht ganz. Die Methode gibt true zurück wenn der übergebene char ein Großbuchstabe ist.

Also wäre das die Bedingung, die zu prüfen ist, bevor das Wort in die HashMap aufgenommen wird?
Ja

Dies kann ich mit der Methode "containsKey()" machen, oder? Anschließend kann ich das Wort entweder mit "put()" inzufügen oder es um eins erhöhen?
Kannst du so machen, ja

wie ich mit der Map am Ende jedes Wort und seine Häufigkeit ausgeben kann.
Eine HashMap besitzt eine Methode entrySet() welche ein Set<Map.Entry<K,V>> zurück gibt, über welches du iterieren kannst. Ungefähr so
Java:
for (Map.Entry<String, Integer> entry : map.entrySet()) {
   String key = entry.getKey();
   Integer value = entry.getValue();
   
}
 

mihe7

Top Contributor
dass es zwei verschiedene Maps gibt: TreeMap und HashMap. Ich denke, dass Du die HashMap meinst? Auf sie kann ich das übertragen,

Kurz zum Verständnis: Map ist ein Interface, das das Verhalten von Objekten festlegt, die dieses Interface implementieren. Map ist geeignet, um Schlüssel-Werte-Paare abzubilden. Ein Schlüssel existiert in einer Map höchstens einmal und wird auf genau einen Wert abgebildet.

TreeMap und HashMap sind einfach zwei verschiedene Implementierungen des Map-Interfaces, die (neben vielen weiteren) in der Java-Standardbibliothek angeboten werden. Wenn Du mit den Methoden von Map auskommst (wie z. B. im konkreten Fall), dann spielt es für die Funktionalität i.d.R. keine Rolle, welche Implementierung Du wählst.
 

Andy_93

Mitglied
Vielen Dank für die Rückmeldung und Ergänzungen.
Ich bastel in den nächsten Tagen ein bisschen daran. Mal sehen ob´s klappt....

Kann ich die Daten, die dann in der HashTabelle gespeichert sind, eigtl auch visualisiert ausgeben, also in der Form einer Tabelle, in der bspw. in der ersten Spalte die Eigennamen stehen und in der zweiten Spalte ihre Häufigkeiten? Bisher weiß ich, dass es Java FX gibt und darin für Tabellen das "TableView".
 

mihe7

Top Contributor
Du kannst mit den Objekten machen, was Du willst - z. B. in einer TableView anzeigen, als HTML rendern lassen, Diagramme anzeigen etc.

Hier etwas Code, den Du ggf. als Startpunkt nehmen kannst. Ich muss allerdings dazusagen, dass es evtl. weit bessere Lösungen gibt, weil sich meine JavaFX-Erfahrungen doch sehr in Grenzen halten.

Du musst lediglich dafür sorgen, dass in countWords die Variable data auf eine Map gesetzt wird, deren Einträge der Lösung Deiner Aufgabe entspricht (im Code werden einfach alle "Wörter" gezählt).

Java:
import java.util.*;
import java.util.stream.Stream;
import static java.util.stream.Collectors.*;
import javafx.application.Application;
import javafx.collections.ObservableListBase;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Test extends Application {
    static class MapList<K,V> extends ObservableListBase<Map.Entry<K,V>> {
        private Map<K,V> data;
        private List<K> keys = new ArrayList<>();

        public MapList(Map<K,V> data) {
            this.data = data;
            keys = data.keySet().stream().sorted().collect(toList());
        }

        public int size() { return keys.size(); }
        public Map.Entry<K,V> get(int ix) {
            K key = keys.get(ix);
            return new AbstractMap.SimpleImmutableEntry<K,V>(key, data.get(key));
        }
    }

    private MapList<String, Integer> countWords(String text) {
        Map<String, Integer> data = Stream.of(text.split(" "))
            .collect(groupingBy(String::toLowerCase, summingInt(s -> 1)));

        return new MapList<String, Integer>(data);
    }

    public void start(Stage stage) {
        final TextArea text = new TextArea();
        text.setPrefColumnCount(40);
        text.setPrefRowCount(5);

        final TableView<Map.Entry<String,Integer>> table = new TableView<>();
        TableColumn<Map.Entry<String,Integer>,String> keyCol = new TableColumn<>("Name");
        TableColumn<Map.Entry<String,Integer>,String> valueCol = new TableColumn<>("Anzahl");
        keyCol.setCellValueFactory(new PropertyValueFactory<Map.Entry<String,Integer>,String>("key"));
        valueCol.setCellValueFactory(new PropertyValueFactory<Map.Entry<String,Integer>,String>("value"));
        table.getColumns().add(keyCol);
        table.getColumns().add(valueCol);

        Button execute = new Button("Auswerten");
        execute.setOnAction(e -> table.setItems(countWords(text.getText())));

        HBox buttons = new HBox();
        buttons.setAlignment(Pos.CENTER);
        buttons.getChildren().add(execute);

        VBox root = new VBox(8);
        root.setPadding(new Insets(10,10,10,10));
        root.getChildren().add(text);
        root.getChildren().add(buttons);
        root.getChildren().add(table);
        stage.setScene(new Scene(root, 600, 400));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
U Char zu einem String machen Java Basics - Anfänger-Themen 1
N Aus einem String die Anzahl der Vokale auslesen Java Basics - Anfänger-Themen 40
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
J String aus einem Array entfernen Java Basics - Anfänger-Themen 10
S Ersetzen eines Asterix in einem String Java Basics - Anfänger-Themen 8
FelixN RegEx aus einem String als String-Array zurückgeben Java Basics - Anfänger-Themen 8
J erstes Vorkommen eines Chars aus einem String entfernen Java Basics - Anfänger-Themen 3
B String zu einem bestehenden String hinzufügen Java Basics - Anfänger-Themen 9
J Wie kann ich z.B. einem int-Wert einen String-Wert zuweisen? Java Basics - Anfänger-Themen 2
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10
F Buchstaben in einem String vertauschen (Ohne replace) Java Basics - Anfänger-Themen 10
Dimax Leerzeilen aus einem String entfernen Java Basics - Anfänger-Themen 61
T Schauen ob eine Ziffer in einem String-Array häufiger vorkommt Java Basics - Anfänger-Themen 8
D Input/Output Array in einem String mit einem Trennzeichen verbinden Java Basics - Anfänger-Themen 17
N Variablen int Wert einem String abgeben Java Basics - Anfänger-Themen 8
C Chars in einem String alphabetisch sortieren Java Basics - Anfänger-Themen 1
F String zu einem Server senden Java Basics - Anfänger-Themen 4
A regulären Ausdruck mit Hilfe der Klasse Scanner in einem String finden Java Basics - Anfänger-Themen 2
D Java doppelte Zahlen auch über 10 in einem String entfernen Java Basics - Anfänger-Themen 2
D Java doppelte Zahl/Zeichen in einem String entfernen Java Basics - Anfänger-Themen 6
F Methoden Kontaktliste - String in einem Array suchen und ausgeben Java Basics - Anfänger-Themen 3
A werte in einem String berechnen Java Basics - Anfänger-Themen 3
F Größtes Produkt in einem String Java Basics - Anfänger-Themen 4
P Char aus einem String auswählen Java Basics - Anfänger-Themen 4
M Benutzerdefinierte Suche in einem String - outofbounds Java Basics - Anfänger-Themen 7
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
C Anzahl bestimmter Zeichen in einem String ausgeben Java Basics - Anfänger-Themen 7
C Position eines Zeichens in einem String ausgeben Java Basics - Anfänger-Themen 1
A Wie kann man einen zufälligen String aus einem StringArray auswählen? Java Basics - Anfänger-Themen 6
M (Leerzeichen) zu einem gesuchten String Java Basics - Anfänger-Themen 4
K String mit Leerstellen und einem X Java Basics - Anfänger-Themen 2
F In einem String nach einem String suchen und Zeichen danach ausgeben Java Basics - Anfänger-Themen 6
D Daten von einem int in einen string Java Basics - Anfänger-Themen 5
D Zahl in einem String finden Java Basics - Anfänger-Themen 4
I Entitäten speichern in einem String? Java Basics - Anfänger-Themen 1
W Schlüsselworte Methode, die die grösste Zahl aus einem String ermittelt und zurückgibt Java Basics - Anfänger-Themen 8
G String einem String Array übergeben Java Basics - Anfänger-Themen 3
C Methoden String von einem toString() herauslesen Java Basics - Anfänger-Themen 2
B Wie aus einem Datum String eine Timestamp erzeugen Java Basics - Anfänger-Themen 6
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
P String Sortieren in einem Array Java Basics - Anfänger-Themen 7
N Maximale Zahl in einem String Java Basics - Anfänger-Themen 8
B Unbekannte Zahl aus einem String umwandeln Java Basics - Anfänger-Themen 15
B Bestimmte Werte aus einem String entnehmen Java Basics - Anfänger-Themen 3
I Aus einem String Vorname & Nachname bekommen Java Basics - Anfänger-Themen 2
J Ascii Zeichen von einem String umwandeln und ausgeben Java Basics - Anfänger-Themen 11
B Werte aus JTextArea in einem String Array ablegen Java Basics - Anfänger-Themen 4
D aus einem einzeiligen String ein neues Objekt erstellen Java Basics - Anfänger-Themen 5
J gesamte Hashmap mit Zeilenumbrüchen in einem String Java Basics - Anfänger-Themen 8
J Aus einem String unbekannte zeichen filtern Java Basics - Anfänger-Themen 11
A mehrere replace in einem string Java Basics - Anfänger-Themen 3
D String einem String[] hinzfügen Java Basics - Anfänger-Themen 13
C String ab einem bestimmten Char abschneiden??? Java Basics - Anfänger-Themen 7
O Zahlenformatierung in einem String Java Basics - Anfänger-Themen 4
J Von einem String einzelne Wörter speichern Java Basics - Anfänger-Themen 6
D Das 1. Wort aus einem String herauslesen Java Basics - Anfänger-Themen 6
Beckenbauer OOP Durch Komma getrennte Einträge in einem String in ein Array oder eine Tabelle schreiben Java Basics - Anfänger-Themen 4
D Zählen von Umlauten in einem String Java Basics - Anfänger-Themen 4
S Zeichen in einem String hochstellen? Java Basics - Anfänger-Themen 9
M Erstes Zeichen in einem String in Großbuchstaben wandeln Java Basics - Anfänger-Themen 3
C Problem mit der Extraktion von Zahlen aus einem String Java Basics - Anfänger-Themen 8
J Anzahl der Buchstaben in einem String Java Basics - Anfänger-Themen 12
I Wie kann ich ein Wort in einem String suchen Java Basics - Anfänger-Themen 3
Z Sonderzeichen in einem String gezeichnen/bearbeiten Java Basics - Anfänger-Themen 6
S Sonderzeichen in einem String erkennen Java Basics - Anfänger-Themen 20
eXistenZ wert von einem String auf einen Integer ändern =( Java Basics - Anfänger-Themen 6
J Wörter in einem string zählen und die anzahl zurückgeben Java Basics - Anfänger-Themen 4
D Einzelne Ziffern aus einem String Java Basics - Anfänger-Themen 10
M Datentypen Mehrere Integer aus einem String auslesen Java Basics - Anfänger-Themen 4
N an einem String ein zahl anhengen Java Basics - Anfänger-Themen 6
V Anzahl eines Buchstaben in einem String zählen Java Basics - Anfänger-Themen 7
R einen gegebenen String in einem String suchen Java Basics - Anfänger-Themen 6
Developer_X jede Zeile einer Datei mit einem String verketten Java Basics - Anfänger-Themen 16
B String einem Chararray zuweisen Java Basics - Anfänger-Themen 2
J Aus einem String blanks entfernen oder hinzufügen. Java Basics - Anfänger-Themen 9
I Aufkommen eines be*timmten Zeichens in einem String zählen Java Basics - Anfänger-Themen 13
S Anzahl von Zeichen in einem String suchen und zählen Java Basics - Anfänger-Themen 1
T Anzahl eines Strings in einem String-Array Java Basics - Anfänger-Themen 5
B Mehrere Methoden an einem String Java Basics - Anfänger-Themen 6
G Zeilenumbruch in einem String Java Basics - Anfänger-Themen 21
N Bytes in einem String Java Basics - Anfänger-Themen 3
M in einem String vergleichen Java Basics - Anfänger-Themen 9
R Probleme beim umwandeln eines String zu einem Int Wert Java Basics - Anfänger-Themen 3
C bestimmte Buchstaben in einem String ändern Java Basics - Anfänger-Themen 5
H Mehrmaliges vorkommen eines Zeichens in einem String Java Basics - Anfänger-Themen 14
M Input/Output Stream aus einem String Java Basics - Anfänger-Themen 2
N Zahl aus einem String finden und als Integer speichern Java Basics - Anfänger-Themen 3
M Aus einem String bestimmte zeichen auslesen und ausgeben Java Basics - Anfänger-Themen 8
philipp Instanznamen mit einem String bestimmen. Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben