# Worttrennung und Wörter zählen



## astalavistamm (20. Jun 2010)

Hallo Freunde!

kann jemand mir für meine java schulAusgaben helfen???

bitte bitte bittee


----------



## Irreparabel (20. Jun 2010)

Threadtitel anpassen, Aufgabe, Ansatz und Problem posten...


----------



## Noctarius (20. Jun 2010)

Also ich denke ohne wenigstens mal zu erklären um was es geht wirst du schlechte Aussichten haben, ansonsten gilt fast immer der Grundsatz: Wir machen keine Hausaufgaben.

Wir helfen bei sichtbarer Eigeninitiative gerne bei Problemen weiter aber komplette Aufgaben lösen wird dir hier keiner.

PS: Titel ist Schrott!


----------



## astalavistamm (20. Jun 2010)

Frage: 
Aus einer Textdatei werden Wörter eingelesen. Sie sind durch mindestens
ein Leerzeichen, Trennzeichen oder Zeilenumbrüche getrennt. 

Beispiel:

Das ist ein Beispiel für
einen Text wie er in einer
Textdatei stehen könnte.

Erstelle für die eingelesenen Wörter Statistiken. Diese soll folgende Kennzahlen ausgeben
und sie in separaten Methoden, angewendet auf alle eingelesenen Wörter, berechnen:

 Anzahl der Wörter
 Anzahl aller Zeichen
 Mittelwert der Wortlängen
 Minimum und Maximum der Wortlängen
 Standardabweichung und Varianz der Wortlängen
 eine Liste der 10 häufigsten Wörter,
 eine Liste der 10 häufigsten Wörter für jede vorkommende Wortlänge (also eine
separate Zählung für jede Länge),

Pass auf, dass das Programm nicht über Sonderzeichen stolpert. Verwende Sortiermethoden
der Java API, sinnvolle Datentypen und achte auf effizienten Code. Dokumentiere
jede Methode passend für “javadoc”.

Hinweis: Für das Einlesen wird die Klasse java.util.Scanner, und für die Statistiken
die Klasse java.util.HashMap oder eine Matrix nützlich sein!


----------



## astalavistamm (20. Jun 2010)

Noctarius hat gesagt.:


> Also ich denke ohne wenigstens mal zu erklären um was es geht wirst du schlechte Aussichten haben, ansonsten gilt fast immer der Grundsatz: Wir machen keine Hausaufgaben.
> 
> Wir helfen bei sichtbarer Eigeninitiative gerne bei Problemen weiter aber komplette Aufgaben lösen wird dir hier keiner.
> 
> PS: Titel ist Schrott!



@noctarius:
ich bin anfänger und wollte ich nur Hilfe.ist das Peinlich?
Wenn man will kann man helfen,wenn nicht kein Problem denke ich.Wir können unsere Kenntnisse teilen denke ich

Danke


----------



## Noctarius (20. Jun 2010)

Von peinlich hab ich nichts gesagt, aber auch als Anfänger sollte man sich Gedanken machen was und wie man postet. Besonders wenn man Hilfe haben will.

PS: Der Titel ist immer noch nicht besser. Ein Titel sollte eine Kurzzusammenfassung des Problems darstellen. ich hab dem Ganzen mal einen sinnvolleren Titel verpasst, weil so wird das sicher später niemandem mehr weiterhelfen, denn nach "meine aufgabe" wird keiner bei Google suchen.


----------



## Landei (20. Jun 2010)

Von der Aufgabe nicht einschüchtern lassen, und immer schön schrittweise vorgehen:
- Wie liest man eine Textdatei ein? Da finden sich x Beispiele im Forum...
- Wie zerlegt man einen String in einzelne Wörter? String.split oder StringTokenizer können weiterhelfen
- Wörter zählen ist nicht schwierig...
- Für die Wortlängen kann man z.B. eine HashMap<Integer, Integer> nehmen, und zwar von Wortlänge -> Anzahl Vorkommen
...


----------



## astalavistamm (20. Jun 2010)

Landei hat gesagt.:


> Von der Aufgabe nicht einschüchtern lassen, und immer schön schrittweise vorgehen:
> - Wie liest man eine Textdatei ein? Da finden sich x Beispiele im Forum...
> - Wie zerlegt man einen String in einzelne Wörter? String.split oder StringTokenizer können weiterhelfen
> - Wörter zählen ist nicht schwierig...
> ...



@Landei:
Kannst du bitte kurz beginnen?

danke


----------



## Eldorado (20. Jun 2010)

Willst du uns etwa ver...? Wie gesagt, erst selbst einen Ansatz posten und eine spezielle Frage stellen, wenn dir etwas nicht ganz klar ist!
mfg
Eldorado


----------



## astalavistamm (20. Jun 2010)

Eldorado hat gesagt.:


> Willst du uns etwa ver...? Wie gesagt, erst selbst einen Ansatz posten und eine spezielle Frage stellen, wenn dir etwas nicht ganz klar ist!
> mfg
> Eldorado



Entschuldige ich mich zuerst aber;

ich hasse die Leute,die geizig  sind.Ich bin noch 15 und wollte ich nur Hilfe für Meine schulübung.
Wenn jemand will,kann das in 5 min schreiben aber es gibt nicht genug solche leute glaube ich..

Danke


----------



## Haave (21. Jun 2010)

Also, für 50 Euro würd ich dir die Aufgaben machen…
… oder bist du dafür zu geizig?


----------



## Final_Striker (21. Jun 2010)

Und wir mögen dreiste Leute nicht, die denken die User des Java-Forums sind nur dazu da um ihre Hausaufgaben zu machen. Und ja es gibt hier genug Leute die das in 5 min machen könnten, wobei ich hoffe das es keinen tun wird.

Helfen heißt nicht machen.

Also, entweder 
   - du kannst ein bisschen was, fängst an und wir helfen dir wenn du nicht weiter kommst 
oder 
   - du kannst nichts, dann wir können dir auch nicht helfen außer mit Empfehlungen zu Tutorials und Büchern.

"Ich bin noch 15"
http://www.java-forum.org/forum-faq...eim-erschleichen-loesungen-fuer-aufgaben.html

siehe Phase 4


----------



## dhachim (21. Jun 2010)

astalavistamm hat gesagt.:


> Frage:
> Aus einer Textdatei werden Wörter eingelesen. Sie sind durch mindestens
> ein Leerzeichen, Trennzeichen oder Zeilenumbrüche getrennt.
> 
> ...



Wenn ich diese Aufgabe so lesen, dann sehe ich, dass es keine Aufgabe ist, die mal als erstes aufgibt. Ich schätze hier hat jemand seine Hausaufgaben bisher auch nicht selber gemacht, und kommt nun nicht zurecht.
Ich werde dir helfen, wenn du anfängst hier Code zu posten, einen Ansatz, deine Ideen. Stell konkrete Fragen, und hier wirst du schnell Hilfe finden. (Suchfunktion mal versuchen )


----------



## Landei (21. Jun 2010)

Ich geb dir mal noch einen Tipp: Wenn etwas zu schwierig erscheint, kann man diesen Schritt erst mal überspringen. Wenn du dir z.B. das Einlesen der Datei erst mal sparen möchstest, kannst du so anfangen:

```
import java.util.*;

class Words {

   public static void main(String[] args) {
       List<String> lines = new ArrayList<String>();
       //das sollte eigentlich aus einer Textdatei kommen:
       lines.add("bla bla bla laber sülz"); 
       lines.add("  \t ");
       lines add("  Das Leben ist       kein Ponyhof  ");   
       lines.add("");
       lines.add("*seufz*");
       lines.add("Wie ekel, schal und unersprießlich dünkt mich das Treiben dieser Welt!"); 
       
       //weiter im text
       List<String> words = new ArrayList<String>(); 
       //und jetzt fülle das mit String.split oder StringTokenizer...  
   }
}
```


----------



## Sycord (21. Jun 2010)

Hallo!

haha voll lustig, ich habe 1 zu 1 die selbe Angabe auch bekommen. Eine Freundin von mir Studiert Mathematik an der Uni in Wien und hat mich gebeten ihr mit diesem Beispiel zu helfen, da sie in Programmieren nicht die beste ist 

Grundsätzlich mal mein Ansatz:
Ich gehe die Datei zeichenweise bis zum EOF(End of File) durch. Dann habe ich eine boolsche Variable inWort. Wenn ein Buchstabe kommt wird diese Variable true und ich speichere mir das Zeichen in einen StringBuffer. Wenn dann ein \n \t oder ' ' kommt bin ich nicht mehr in einem Wort, ich speichere mir den Inhalt des StringBuffers in eine HashMap (bzw wenn das Wort schon in der HashMap ist erhöhe ich den Value um 1) und lege einen neuen StringBuffer an. Gleichzeitig bei diesen durchläufen speichere ich mir min, max und durchschnittswortlänge.

Nun habe ich aber große Probleme die Wortliste der 10 häufigsten Worte zu erstellen.
Ich hab mir überlegt die HashMap in einer foreach durchzugehen und dann die Worte in ein 10 Stellen großes String Array zu speichern.
Aber irgendwie hat das nicht ganz so geklappt wie ich mir das vorstelle
Hat irgendjemand eine gute Idee wie man das lösen könnte? Bzw. ist mein Ansatz überhaupt denkbar?


----------



## Eldorado (21. Jun 2010)

Meine Idee wäre auf die schnelle, eine Liste erstmal von Groß nach Klein zu ordnen und dann die ersten 10 Elemente rauszunehmen.
mfg
Eldorado


----------



## faetzminator (21. Jun 2010)

@Sycord:
Du gehst von Hand Zeichen für Zeichen durch? Verwende Regex ([c]String.split()[/c]) o.ä. ...
Wenn man eine [c]Map<String, Integer>[/c] für den Wert (Wort) und die Anzahl Vorkommnisse hat, kann man das doch einfach in [c]Map<Integer, List<String>>[/c] konvertieren, wobei Integer die Anzahl Vorkommnisse sind. Sortiert kann man die ersten 10 ganz einfach auslesen.


----------



## Landei (21. Jun 2010)

Sycord hat gesagt.:


> Nun habe ich aber große Probleme die Wortliste der 10 häufigsten Worte zu erstellen.
> Ich hab mir überlegt die HashMap in einer foreach durchzugehen und dann die Worte in ein 10 Stellen großes String Array zu speichern.
> Aber irgendwie hat das nicht ganz so geklappt wie ich mir das vorstelle
> Hat irgendjemand eine gute Idee wie man das lösen könnte? Bzw. ist mein Ansatz überhaupt denkbar?



Ungetestet:

```
class WordCount implements Comparable<WordCount>{
   final int count;
   final String word;
   public WordCount(String word, int count) {
      this.word = word;
      this.count = count;
   }
   public int compareTo(WordCount wc) {
      if(count == wc.count) return wc.word.compareTo(word)
      else return wc.count - count; 
   }
}

...

Map<String, Integer> countMap = HashMap<String, Integer>();
for(String word : wordList) {
   if (countMap.containsKey(word)) {
       countMap.put(word, countMap.get(word) + 1);
   } else {
       countMap.put(word, 1);
   }  
}
Set<WordCount> frequency = new TreeSet<WordCount>(); //TreeSet ist geordnet
for(Map.Entry<Strint, Integer> entry : countMap.entrySet()) {
   frequency.add(new WordCount(entry.getKey(), entry.getValue());
}
//die zehn häufigsten stehen am Anfang von frequency
```


----------



## ARadauer (21. Jun 2010)

> Ich gehe die Datei zeichenweise bis zum EOF(End of File) durch. Dann habe ich eine boolsche Variable inWort.


Ich würde einfach das File zeilenweise also ArrayListe mit Strings einlesen und dann für jeden Statistik wert eine eigene Methode schreiben die die Liste als Argument hat...



> Kannst du bitte kurz beginnen?


Wenn man Anfänger ist, sieht man oft den Wald vor lauter Bäume nicht und man weiß nicht wie man ansetzen soll, da kann ein Anfang schon sehr hilfreich sein...

also ein Anfang könnte mal so aussehen:



```
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;



public class Test {
   
   
public static void main(String[] args) {
   Test tester = new Test();
   ArrayList<String> lines = tester.getFileAsList(new File("c://test.txt"));
   System.out.println("Zeichen: "+tester.countCharacters(lines));
   System.out.println("Wörter: "+tester.countWords(lines));
}

   
   
   public ArrayList<String> getFileAsList(File f){
    ArrayList<String> result = new ArrayList<String>();
      BufferedReader reader = null;
      try {
         reader = new BufferedReader(new FileReader(f));
         
         String line;
         while((line=reader.readLine())!=null){
               result.add(line);
         }
      } catch (Exception e) {
         //Logging
         e.printStackTrace();
        
      }finally{
         if(reader!=null){
            try {reader.close(); } catch (IOException e1) {}
         }
      }
      return result;
   }
   
 
   // Anzahl aller Zeichen
   public int countCharacters(ArrayList<String> lines){
      int result = 0;
      for(String line: lines){
         result += line.length();         
      }
      result+=lines.size()-1; //die Zeilenumbrüche noch dazu.
      return result;
   }
   
   //Anzahl aller Wörter
   public int countWords(ArrayList<String> lines){
      int result = 0;
      for(String line: lines){
         result += line.split(" ").length;         
      }      
      return result;
   }

}
```

Der Nachteil bei einem fremden Anfang  ist halt, dass dies der einfach Teil war und jetzt kommen die schweren sachen die du mit einem fremden Rahmen lösen musst... aber das ist eine andere geschichte...


aja ... ungetestet...


----------



## Sycord (21. Jun 2010)

@ARadauer: Zeichenweise habe ich deswegen lieber, weil ich es so leichter finde die Anzahl der Zeichen zu finden.

Hab grad in der Schule einen Klassenkollegen um Hilfe gebeten und wir haben das ganze so gelöst:
Anstatt der Hashmap verwende ich jetzt eine ArrayList, die ich mithilfe Collections.sort leicht sortieren kann. Dann muss ich einfach nur noch die ersten zehn der ArrayList ausgeben.
Für die Liste der 10 häufigsten Wörter für jede vorkommende Wortlänge habe ich einen Comperator geschrieben, der nach Wortlänge und dann nach Anzahl sortiert.

[Java]  public int compare(Wort word1, Wort word2) {
    int cmp = word1.getWort().length()-word2.getWort().length();
    if (cmp==0) {
      cmp = word2.getAnz()-word1.getAnz();
    }
    return cmp;
  }[/Java]

Und dann verwend ich bei der Ausgabe halt einen einfachen Gruppenwechsel, sortiert sind sie ja schon durch den Comperator

Aber auf jeden fall danke für die Hilfe


----------



## k.a. (30. Jul 2010)

sorry, ich hätte ne' frage, unswar habe ich heute mittag gelesen, dass jemand 534 buchstaben in einem wort hatte, das mit*eineurojobber* anfängt.
Weiter weis ich leider nicht mehr und den namen der person habe ich mir leider auch nicht gemerkt!
Aber ich bekomme von meiner freundin 10 euro, wenn ich ihr ein Wort mit über 500 buchstaben sagen kann!
Bitte kann mir jemand sagen, wo ich ihn finde oder wie er heißt? ich habe nur bis morgen 17:00 uhr zeit-bitte!!!


----------



## Marco13 (30. Jul 2010)

Wie wär's auf Englisch? Das längste Wort im Englischen ist "Titin". Zumindest dessen korrekte chemische Bezeichnung, mit 189819 Buchstaben. Deutsch ist ja langweilig. Da kann man ja beliebige Worte sinnlos aneinanderreihen. Tastaturstaubsaugerbeutelverschlussherstellungs... bla bla bla....


----------



## XHelp (30. Jul 2010)

Das Wort was du suchst lautet


> EineurojobberReinigungskraftArbeitsbekleidungs
> BeihilfeAntragsformularBearbeitungsvorgangsweise
> RichtlinienDurchführungsbestimmungs
> ErmessensspielraumStrategieVerschleierungs
> ...


Was übrigens der 1. Treffer im Google mit der Anfrage "längstes deutsches wort 534"


----------



## karuchalr (17. Jan 2011)

ARadauer hat gesagt.:


> Ich würde einfach das File zeilenweise also ArrayListe mit Strings einlesen und dann für jeden Statistik wert eine eigene Methode schreiben die die Liste als Argument hat...
> 
> 
> Wenn man Anfänger ist, sieht man oft den Wald vor lauter Bäume nicht und man weiß nicht wie man ansetzen soll, da kann ein Anfang schon sehr hilfreich sein...
> ...





Hallo, das hier Zählt auch die Zeichen aber ohne "Blanks"
Blanks, werden erzetzt


```
// Anzahl aller Zeichen
     public int countCharacters(ArrayList<String> lines){
        int result = 0;
        int zeichen;
        for(String line: lines){
          zeichen =  line.replaceAll(" ","").length();  
           //result += line;
           result += zeichen;
        }
       
        //result += line;   //.size()-1; //die Zeilenumbrüche noch dazu.
        return result;
```


----------

