# Treeset mit Objekt (Fehler beim speichern im Treeset)



## MythosX (31. März 2008)

Hey,

ich hab ein kleines Problem. Ich möchte in einem Treeset einen Text speichern, in dem alle Wörte sotiert und mit der Häufigkeit (das Treeset ja die doppelten Wörter nicht mit aufnimmt) des einzelnen Wortes gespeichert werden.

Deswegen hab ich eine Klasse geschrieben die eine String Variable für das Wort und eine Integer Variable für die Häufigkeit des Wortes.

Jetzt habe ich das Problem das nur das Wort im Treeset gespeichert wird. Nicht die Häufigkeit. Diese bleibt immer auf 1. 
Zur Zeit hab ich es auch erstmal soweit das die Anzahl auf 2 gesetzt werden soll wenn ein Wort öfter vorkommt.


Hier die Klasse Wort:

```
package textstatistik;

public class Wort implements Comparable<Wort>{
    String wortwert;
    int häufigkeit;
    
    public Wort(String ww) {
        wortwert = ww;
        häufigkeit = 1;
    }
    
    public boolean equals(Object einWort) {
        Wort w = (Wort) einWort;
        return getwortwert().equals(w.getwortwert());
    }
    
    public int hashCode() {
        return wortwert.hashCode();       
    }
    
    public int compareTo(Wort w) {
        return wortwert.compareTo(w.getwortwert());
    }
    
    public String getwortwert() {
        return wortwert;
    }
    
    public int gethäufigkeit() {
        return häufigkeit;
    }
    
    public void sethäufigkeit(int h) {
        häufigkeit = häufigkeit + h;     
    }
    
   public String toString() {
        return wortwert + " : " + häufigkeit;
    }
}
```

Und hier die Klasse textstat:

```
package textstatistik;
import java.io.*;
import java.util.*;

public class txtstat {
    
    private TreeSet<Wort> textset = new TreeSet<Wort>();
  
    public txtstat() {
    }
    
    private String lesepfad() {
        String pfad ="";
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            pfad = in.readLine();
        }
        catch (Exception e) {            
        }
        finally {
            return pfad;
        }
    }
    
    public String öffnen() {
        String text ="";
        try {
            BufferedReader datei = new BufferedReader(new FileReader(lesepfad()));
            String zeile = null;
            String tmp = null;
            int i = 0;
            while((zeile=datei.readLine())!=null) { 
                StringTokenizer str = new StringTokenizer(zeile);
                while (str.hasMoreTokens()) {
                    tmp = str.nextToken();
                    Wort neueswort = new Wort(tmp.replaceAll("[_[^\\w\\däüöÄÜÖ\\+\\- ]]", ""));
                    //neueswort.equals(textset);
                    if(textset.contains(neueswort)==true) {
                        neueswort.sethäufigkeit(1);
                        i++;
                    }
                    System.out.println(neueswort.getwortwert() + " " + neueswort.gethäufigkeit());
                    textset.add(neueswort);
                    
                }
                
            }
            System.out.println(i);
            datei.close();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
        finally {
            return text;
        }      
    }
    
    public void ausgeben() {
        System.out.println(textset);
        System.out.println(textset.size());
    }
  
}
```

Und in der Main steht folgendes:

```
package textstatistik;

public class Main {
    
    public Main() {
    }
    
    public static void main(String[] args) {
        txtstat text1 = new txtstat();
        text1.öffnen();
        text1.ausgeben();
    }
    
}
```

Ich hoffe ihr könnt mir helfen. Ich habe schon das halbe Internet durchforstet und Suche jetzt schon seit 2 Tagen.

Bitte helft mir


----------



## zerix (1. April 2008)

Hallo,

das ist ja auch klar warum es nicht funktioniert. 
Wenn du ein Wort einfügen willst, welches schon vorhanden ist, wird das vorhandene nicht überschrieben, sondern das alte bleibt vorhanden.

Du müsstest es schon so machen

```
while (str.hasMoreTokens()) {
                    tmp = str.nextToken();
                    Wort neueswort = new Wort(tmp.replaceAll("[_[^\\w\\däüöÄÜÖ\\+\\- ]]", ""));
                    //neueswort.equals(textset);
                    if(textset.contains(neueswort)) {
                        textset.remove(neueswort);
                        neueswort.sethäufigkeit(1);
                        i++;
                    }
                    System.out.println(neueswort.getwortwert() + " " + neueswort.gethäufigkeit());
                    textset.add(neueswort);
                    
                }
```

MFG

Sascha


----------



## MythosX (2. April 2008)

Hey,
super Danke!
Manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

Jetzt hab ich nur noch das Problem das ich ein bestimmtes Element aus dem Treeset ausgeben möchte. 
Wenn die Funktion remove doch ein Element findet und dieses entfernt muss es doch auch eine Funktion geben die es findet uns ausgibt. 

Oder am besten wie ich auf ein bestimmten Wert aus dem Element zugreifen kann.

mfg


----------



## zerix (2. April 2008)

Dir bleibt nichts anderes übrig als über das TreeSet zu iterieren. 


```
for(Wort w : deinTreeSet){

if(deineüberprüfung){

}

}
```

Die Methode remove macht nichts anderes. Es wird über das TreeSet iteriert bis das Element gefunden wird, welches mit compareTo 0 zurück gibt. Das Element wird dann entfernt. 

MFG

Sascha


----------

