Häufigkeit von Wörtern ausgeben in Java

Diskutiere Häufigkeit von Wörtern ausgeben in Java im Developer Network Forum im Bereich Hardware & Software Forum; Hallo ! Ich habe ein Problem bei einer Aufgabe: "Schreiben Sie ein Programm, das mit Hilfe von Collections eine alphabetische Liste aller Wörter...
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #1
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
Hallo !

Ich habe ein Problem bei einer Aufgabe: "Schreiben Sie ein Programm, das mit Hilfe von Collections eine alphabetische Liste aller Wörter einer Datei mit ihren Häufigkeiten ausgibt."


Ich habe soweit schon angefangen und poste einfach mal meinen Code:

Code:
package uebungsaufgabe_collections;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.Collection;
import java.util.TreeMap;
import java.util.Iterator;

/**
 *
 * @author 
 */
public class Uebungsaufgabe_Collections {

    static TreeMap<String, Integer> map = new TreeMap<String, Integer>();

    public int count() throws IOException {
        StreamTokenizer st = new StreamTokenizer(new FileReader("datei.txt"));
        int tokenType = st.nextToken();
        String token;
        int count = 0;

        while ((tokenType != StreamTokenizer.TT_EOF)) {
            if (tokenType == StreamTokenizer.TT_WORD) {
                token = st.sval;
                Integer get = map.get(token);
                if (get == null) {
                    map.put(token, tokenType);
                } else {
                    count++;
                }
            }
        }
        return count;
    }

    public static void main(String[] args) throws FileNotFoundException, IOException {

        Uebungsaufgabe_Collections uc = new Uebungsaufgabe_Collections();
        int count = uc.count();

        Collection c = map.values();
        Iterator it = c.iterator();

        while (it.hasNext()) {
            Object next = it.next();
            System.out.println(uc.count());
        }
    }
}


Meine Datei.txt sieht so aus: "ABC ABC ABC abc abc abc Test Test Test"


Ich komme nicht weiter. Die Ausgabe soll nachher so aussehen:

"ABC: 3 mal
abc: 3 mal
Test: 3 mal"



Kann mir evtl. jemand einen Denkanstoss geben ;)?

Gruß
 
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #2
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
Halloechen,

Dein erster Fehler: Du liest unendlich oft den ersten token. Du solltest also in der Schleife "irgendwann" auch mal die "nextToken()"-Methode des StreamTokenizers aufrufen.
Und das Zaehlen solltest Du Dir auch noch mal genauer anschauen. Du hast einen Counter den Du bei jeder wiederholung hochzaehlst - egal welches "Wort" gerade aktuell ist.

Debugge das ganze einfach mal. Da siehst Du sicher gleich wo es klemmt.

Gruss, FFNB.
 
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #3
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
Komme irgendwie immer noch nicht so wirklich weiter. Kann evtl. nochmal jemand über meinen Code sehen ?

Danke

Code:
package uebungsaufgabe_collections;

import java.util.*;
import java.io.*;
import static java.lang.String.CASE_INSENSITIVE_ORDER;

/**
 *
 * @author
 */
public class Uebungsaufgabe_Collections {

    public void count() throws IOException {
        StreamTokenizer st = new StreamTokenizer(new FileReader("datei.txt"));
        TreeMap<String, Integer> map = new TreeMap<String, Integer>(CASE_INSENSITIVE_ORDER);

        int tokenType;
        String token;
        int counter = 0;


        while ((tokenType = st.nextToken()) != StreamTokenizer.TT_EOF) {
            token = st.sval;

            Integer get = map.get(token);
            if (get == null) {
                map.put(token, tokenType);
            } else {
                counter++;
            }
        }

        Set<String> keySet = map.keySet();
        for(String s : keySet) {
            System.out.println(map.get(s));
        }
    }

    public static void main(String[] args) throws IOException {

        Uebungsaufgabe_Collections uc = new Uebungsaufgabe_Collections();
        uc.count();
    }
}
 
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #4
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
Vorne weg, von Java hab ich kaum ahnung und ich hab auch keine anständige IDE um die Syntax zu prüfen, aber setze diese Methode mal in einem Gedankenexperiment ein:
Code:
    public void count() throws IOException
    {
        // Vorbereitung der Datei und der Liste
        StreamTokenizer st = new StreamTokenizer(new FileReader("datei.txt"));
        TreeMap<String, Integer> map = new TreeMap<String, Integer>(CASE_INSENSITIVE_ORDER);

        String token;

        // Solange noch Wörter vorhanden sind...
        while(st.nextToken() != StreamTokenizer.TT_EOF)
        {
            // Nächstes Token auslesen
            token = st.sval;
            // Anzahl zum Token aus der Liste holen
            Integer get = map.get(token);
            // Wenn die Anzahl null ist, wird eine 1 hinein geschrieben
            if (get == null)
            {
                map.put(token, 1);
            }
            // Sonst die vorherige Zahl um 1 erhöht
            else
            {
                map.put(token, get+1);
            }
        }

        Set<String> keySet = map.keySet();
        for(String s : keySet)
        {
            System.out.println(map.get(s));
        }
    }

Ich kann also weder für Syntax noch für Sinn garantieren, ist nur auf die Schnelle hingeschrieben und geht höchst wahrscheinlich viel viel einfacher und eleganter :)
(oder eben so garnicht ^^)
 
Zuletzt bearbeitet:
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #5
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
Hallo !

vorab vielen Dank für die Antworten. Habs soweit hinbekommen und mein Programm läuft :). Hätte jedoch noch eine Erweiterung, die ich jedoch nicht so wirklich hinbekomme. Und zwar sollen Values mit gleichem Wert gruppiert werden, d.h. z.B.

Wurst Hans Meyer: 3
Test Hallo bla: 2
und Moin: 1
usw...


Meine jetzige Ausgabe sieht so aus:

bla: 2
Hallo: 2
Meyer: 3
Moin: 1
Test: 2
und: 1
Wurst: 3
usw...


Code:
package collections;

import java.util.*;
import java.io.*;

public class Collections {

    public void count() {
        StreamTokenizer st = new StreamTokenizer(new FileReader("datei.txt"));
        TreeMap<String, Integer> map = new TreeMap<String, Integer>();

        String token = null;

        while (st.nextToken() != StreamTokenizer.TT_EOF) {

            token = st.sval;

            Integer get = map.get(token);

            if (get == null) {
                map.put(token, 1);
            } else {
                map.put(token, get + 1);
            }
        }

        List<String> list = new LinkedList<String>();
        for (String key : map.keySet()) {
            list.add(key);
        }

        Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

        for (String s : list) {
            System.out.println(s + ": " + map.get(s));
        }
    }

    public static void main(String[] args) {

        Collections uc = new Collections();
        uc.count();
    }
}



Mein Ansatz wäre, dass man man die TreeMap dann so erstellt:

"TreeMap<Integer, List<String>> map = new TreeMap<Integer, List<String>>();"


Komme leider nicht wirklich weiter =/
 
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #6
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
Wenn es lediglich um die Ausgabe geht: 2 for-Schleifen, in der äußeren zählst du die Anzahl der vorkommenden Wörter (nach der du sortieren sollst) und in der inneren gehst du die Einträge in der Map durch.

Sollte allerdings die ganze Map sortiert sein, google mal nach "java map sort by value", ich hab nur kurz drüber geguckt, kenn mich wohl aber nicht genug mit Java aus.
 
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #7
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
Also ich glaube dein Vorschlag mit den 2 for-Schleifen sollte reichen, die ganze Map brauch nicht sortiert sein. Hast Du evtl. nen Ansatz wie ich das mit den 2 for-Schleifen mache ? Habe gerade überhaupt keinen Ansatz dafür =/ Pseudo-Code würde mir natürlich schon reichen ;)

Danke
 
Zuletzt bearbeitet:
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #8
T

TrµMAn

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
4.882
Reaktionspunkte
2
Ort
Wuppertal
Hier dein Pseudocode (nochmal nach einer anderen Überlegung) :
Code:
for(int i = 1; i < map.maximalValue; i++)
{
    foreach(string key in (string)map.getKeysFromValue(i))
    {
        Output(key);
        Output(", ");
    }
    Output(i);
    Output(NewLine);
}

map.maximalValue <- größter Wert bei den Values
map.getKeysFromValue(i) <- funktion um ein Array der Schlüssel die einen bestimmten Wert haben zu hohlen (ich weiß nicht ob es eine Methode dafür gibt, finde grad keine, sollte es keine geben muss man eben durch alle Schlüssel gehen und danach nochmal den Wert überprüfen)
Output() <- Methode zur Ausgabe

sollte dann erst alle Wörter (mit Komma getrennt) und am ende die Anzahl ausgeben
 
  • Häufigkeit von Wörtern ausgeben in Java Beitrag #9
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
hm, komme damit nicht wirklich weiter. Ist hier evtl. jemand anders der sich mit Java gut auskennt und mir das evtl. kurz erklären kann wie der Code von "TrµMAn" gemeint ist ? ^^
 
Thema:

Häufigkeit von Wörtern ausgeben in Java

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben