String Arrays - häufigste Wörter

clemensum

Mitglied
Meine Aufgabe besteht u.a. darin, dass ich die zehn häufigsten Wörter einer eingelesenen Textdatei (z.B. eine Passage aus dem Faust) mithilfe Java-Programmierung bestimmen soll.

Ich bin elementar vorgegangen und noch nicht ganz fertig (was durchaus zulässig ist) und habe mir einen einfachen Algorithmus überlegt, welchen ich nun kurz in Worten fassen möchte:
Das erste Wort des Arrays wird mit allen anderen Wortes des Arrays auf (String-)Gleichheit überprüft. Gilt die Gleichheit, so wird ein Zähler um eins erhöht.
Genauso für das zweite Wort, wobei es mit den anderen Worten ab dem 1. Arrayelement wieder verglichen wird.
Auf eines muss man jedoch achten: Es ist sinnlos ein schon einmal verglichenes Wort wieder mit den anderen auf Gleichheit zu untersuchen, daher habe ich ein Hilfsarray definiert, wo alle bisherigen Startwörter eingefügt werden. In der if-Abfrage soll nun geschaut werden, ob das neue Startelement schon einmal als ein solches vorgekommen ist.
Beispielarray:
[Mutter, Esel, Liebe, Hass, Esel, Mutter, Garten, Hase, Baum, Hase, Käfer, Eva, Wald, Baum]
Das Wort "Mutter" wird nun mit allen anderen Elementen des Arrays auf Gleichheit verglichen.
Jedoch: Wenn array[j] bei der zweiten "Mutter" angelangt ist, muss nicht mehr mit den anderen worten auf Gleichheit überprüft werden, denn das ist ja schon passiert. Dieser Umstand führt auf die Idee ein Hilfsarray einzuführen, in dem alle Wörter stehen, die schon mit allen anderen verglichen wurden. Es wird deshalb in einer if-Abfrage geschaut, ob array[j] schon im Hilfsarray hilfsarray vorkommt. Wenn ja, dann kann der Vergleich in diesem inneren Schleifenduechgang ausfallen, wenn nein... (ich hoffe, es ist klar geworden, was meine Idee diesbezüglich ist)

Nun der Code:
Java:
static String zehnhäufigstenWörter(Integer[] array) {
		int i, j = 0, zähler = 0;
		int[] hilfsarray = new int[array.length];
		//while (j < array.length) {
			//hilfsarray[j] = array[j];
			//j++;
		//}
		
		while (j < array.length) {
			i = 0;
			while (i < array.length) {
	if (array[j].equals(array[i]) && !array[j].equals(hilfsarray[j]) )  //hier, rechts vom UND-Symbol sollte dieser Befehl hinein, wo ich abfrage, ob das Anfangselement denn nicht schon einmal ein solches war und daher nicht mehr mit den anderen verglichen werden muss. 


 {
					zähler++; 
				hilfsarray[j] = array[j]; 
				
				}
				i++;
			}
			j++;
		}
	}

Meine kommentierter Code (siehe if-Abfrage) ist natürlich ein semantischer Unsinn. Ich habe jedoch keinen Befehl gefunden mit dem ich nachfragen kann, ob denn das neue array[j] denn nicht schon im Hilfsarray vorkommt. Ich möchte also abfragen: Ist array[j] € hilfsarray? (wobei das Eurozeichen an das mathematische Elementzeichen erinnern soll).
Ich wollt euch nun fragen, ob es denn so einen Befehl überhaupt gibt, oder muss ich dies extra mit einer weiteren Schleife abprüfen, ob array[j] ein Element von hilfsarray ist?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Darfst du auch andere Datenstrukturen verwenden?
Dann würd ich dir zu dem TreeSet raten. Zusätzlich kontruierst du dir noch einen eigenen Datentyp der ein Wort und seine Häufigkeit umfasst. Den kannst du dann ins TreeSet packen.

EDIT:
Grad wiedergefunden, vllt kannste dir da nen paar Ideen abschaun.

Java:
	public static void main(String[] args) {		
		String text = "I have a blue house with a blue window Blue is the colour of all that I wear Blue are the streets and all the trees are too I have a girlfriend and she is so blue";
		
		WordFrequencyAnalysis wfa = new WordFrequencyAnalysis(false);
		wfa.add(text);
		
		Set<WordFrequency> frequencies = wfa.getWordFrequencies();
		
		for (WordFrequency wf : frequencies) {
			System.out.println(wf.getWord() + " -> " + wf.getFrequency());
		}
	}

Java:
public class WordFrequencyAnalysis {

	private Map<String, WordFrequency> wordFrequencies;
	private boolean caseSensitive; 
	
	public WordFrequencyAnalysis() {
		this(false);
	}
	
	public WordFrequencyAnalysis(boolean caseSensitive) {
		wordFrequencies = new HashMap<String, WordFrequency>();
		this.caseSensitive = caseSensitive;
	}
	
	public void add(String text) {		
		// remove punctuation marks
		text = text.replaceAll(",|\\.|!|\\?|-|_", "");
		
		StringTokenizer tokenizer = new StringTokenizer(text);
		while (tokenizer.hasMoreTokens()) {
			String token = tokenizer.nextToken();
			addWord(token);
		}
	}
	
	private void addWord(String word) {
		if (!isCaseSensitive()) {
			word = word.toLowerCase();
		}
		
		if (wordFrequencies.containsKey(word)) {
			wordFrequencies.get(word).incrementFreqency();
		} else {
			wordFrequencies.put(word, new WordFrequency(word));
		}
	}
	
	public Set<WordFrequency> getWordFrequencies() {
		Set<WordFrequency> wfSet = new TreeSet<WordFrequency>();
		
		for (Map.Entry<String, WordFrequency> entry : wordFrequencies.entrySet()) {
			wfSet.add(entry.getValue());
		}
		
		return wfSet;
	}
	
	public int getWordFrequency(String word) {
		if (!wordFrequencies.containsKey(word)) {
			return 0;
		}
		
		return wordFrequencies.get(word).getFrequency();
	}
	
	public boolean isCaseSensitive() {
		return caseSensitive;
	}
}

Java:
public class WordFrequency implements Comparable<WordFrequency> {
	private String word;
	private int frequency;
	
	public WordFrequency(String word) {
		this.word = word;
		frequency = 1;
	}
	
	public void incrementFreqency() {
		incrementFrequency(1);
	}
	
	public void incrementFrequency(int i) {
		frequency += i;
	}
	
	public String getWord() {
		return word;
	}
	
	public int getFrequency() {
		return frequency;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + frequency;
		result = prime * result + ((word == null) ? 0 : word.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		WordFrequency other = (WordFrequency) obj;
		if (frequency != other.frequency)
			return false;
		if (word == null) {
			if (other.word != null)
				return false;
		} else if (!word.equals(other.word))
			return false;
		return true;
	}

	@Override
	public int compareTo(WordFrequency o) {
		if (frequency == o.frequency) {
			return word.compareTo(o.word);
		}
		
		return frequency < o.frequency ? 1 : -1;
	}
}
 
Zuletzt bearbeitet von einem Moderator:

clemensum

Mitglied
Java:
   text = text.replaceAll(",|\\.|!|\\?|-|_", "");

Wie kann ich daraus ablesen, welche Sonderzeichen der Compiler durch "nichts" ersetzt???
Wie könnte ich z.B. ihm sagen, dass er Dollerzeichen auch ignorieren soll, so?

Java:
text = text.replaceAll(",|\\.|!|\\?|-|_ //$", "");
Es scheint nirgenwoe in der API zu stehen, wie man genau die Sonderzeichen hineinschreiben soll, es steht nur, was der Befehl macht... :bahnhof:

Hat da jemand eine Idee?
 

eRaaaa

Top Contributor
//$ --> \\$

manche Sonderzeichen müssen im Regex escaped werden, da sie sonst eine Sonderaufgabe haben!
z.B. eben der Punkt, der steht auch für jedes Zeichen! Wenn du nun aber den Punkt meinst, musst du den maskieren mit \\ und nicht mit //
:D
Das ODER kannst du dir eig. auch sparen -> "[,\\.!\\?\\-_\\$]"

EDIT: @EikeB: den hashcode nachträglich zu ändern ist gefährlich :)
 
Zuletzt bearbeitet:

clemensum

Mitglied
Hallo liebe Java-Programmierer! :)

Da wir in der Vorlesung die Maps noch nicht hatten und ich mich dort erst gerade mühsam einarbeiten muss und trotzdem bis nächste Woche eine Arbeit abzugeben habe, bitte ich euch um einen Tipp, wie man aus dem obig angegebenen Code, d.h. aus den drei Klassen für die Worthäufigkeiten, die zehn häufigsten Worte ermitteln kann. D.h., ich bitte euch, mir die Stelle zu sagen, wo ich das entsprechend ändern kann, weil ich kann dies ( noch ) nicht richtig erkennen! :bahnhof:

Meine Vermutung ist, dass man in der main-Methode dazu eine Schleife einbauen muss, die nur die ersten zehn Worte ausgeben, statt alle, habe ich recht?

EDIT: Ich meine die drei Klassen von EikeB. :rtfm:
 
Zuletzt bearbeitet:
M

Marcinek

Gast
Zähle doch alle Wörter und gebe die häufisten aus? ;D

Dazu nimmst du dir entweder eine ArrayList oder machst dir ein selbst wachsendes Array.

Gruß

Martin
 

Volvagia

Top Contributor
Was spricht gegen eine HashMap?

Java:
public void addWord(String word)
{
	Integer count = map.get(word);
	if(count == null)
	{
		map.put(word, 1);
		return;
	}
	count++; //Sollte durch Autoboxing möglich sein, aber nicht zu 100% sicher.
	map.put(word, count);
}

Oder so ähnlich. Vorteil: Sehr schneller Zugriff. Nachteil: Unsortiert, also musst du am Ende selbst rausfinden, wo die höchste Anzahl steht, aber ist ein Klacks. :D
 
G

Gast2

Gast
Ich verwende doch ne map? Oder wen meinst du?
Statt nem einfachen Integer pack ich halt nen eigenen Datentypen rein.

@eRaaaa:
Danke, merk ich mir ;)
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
Z Ersten Buchstaben eines Elements eines String-Arrays auslesen Java Basics - Anfänger-Themen 5
M Compiler-Fehler Fehler bei String-Arrays Java Basics - Anfänger-Themen 3
S Datentypen Mit einer Methode String arrays geben Java Basics - Anfänger-Themen 9
N Vergleich zweier String Arrays scheitert Java Basics - Anfänger-Themen 3
J 2 String Arrays in neuem String Array verbinden Java Basics - Anfänger-Themen 4
D String-Arrays miteinander verbinden Java Basics - Anfänger-Themen 5
M Ausgeben eines 2D Arrays mit int UND String werten - BLUEJ! Java Basics - Anfänger-Themen 4
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
M Datentypen java.util.Arrays$ArrayList cannot be cast to [Ljava.lang.String; Java Basics - Anfänger-Themen 11
K valueOf() für String Arrays? Java Basics - Anfänger-Themen 4
W elemente eines arrays in einen string schreiben Java Basics - Anfänger-Themen 3
S Arrays - Fehler bei der Verarbeitung: For input string: "Berlin" Java Basics - Anfänger-Themen 14
I char arrays zu string Java Basics - Anfänger-Themen 7
R Sortieren eines 2-dim String Arrays Java Basics - Anfänger-Themen 4
R String Arrays Inhalte vergleichen Java Basics - Anfänger-Themen 4
T String, Arrays, GUI, ActionListener Java Basics - Anfänger-Themen 4
S Arrays nach String kovertieren und sortieren Java Basics - Anfänger-Themen 4
P Inhalte aus Methoden in String Arrays bringen Java Basics - Anfänger-Themen 4
N Ausgabe des Inhalts eines String Arrays in einer ArrayList Java Basics - Anfänger-Themen 4
S Minimum eines String-Arrays Java Basics - Anfänger-Themen 16
Dilandau größe eines string arrays? Java Basics - Anfänger-Themen 3
M String und Int Arrays dynamisch die Größe verändern Java Basics - Anfänger-Themen 7
T string arrays Java Basics - Anfänger-Themen 7
krgewb String mit Datumsangabe in Long umwandeln Java Basics - Anfänger-Themen 2
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
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
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 3
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5
C String/Char-API Java Basics - Anfänger-Themen 13
U Char zu einem String machen Java Basics - Anfänger-Themen 1
B Anzahl Nullen uns Einsen in String ermitteln Java Basics - Anfänger-Themen 3
T Leerzeichen im String entfernen Java Basics - Anfänger-Themen 6
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben