# Anzahl Wörter in Zeile



## karuchalr (13. Jan 2011)

Hallo!
bin ganz neu in Java und bin noch kein Profi; ich habe nur Erfahrung mit VB 6 aber dass ist schon eine ewigkeit her!!, deshalb brauche ich ganz dringend eure Hilfe!!
Ich muss ein text aus der Festplatte einlesen und zeilenweise auf der Konsole zeigen, dafür habe ich ein ArrayList genommen.
Den Text einlesen klappt schon und zeigt mir auch die Zeilen, nun muss ich auch aus dieser ArrayList , Anzahl der Wörter, Buchstabe und Zeile anzeigen!! 
aber ich habe keine Ahnung wie, nach Vb Methode  geht es leider nicht. Also könnt ihr mir bitte helfen??  



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

public class TextAnalyse
{
	public static void main (String [] args)
	{
		String line;
		ArrayList<String> zeilen = new ArrayList<String>();
		{
			try
			{
				BufferedReader br = new BufferedReader (new FileReader("C:/Text.txt");
				
				while((line = br.readLine()) != null)
				{
					zeilen.add(line);
				}
				br.close();
			}
			catch (FileNotFoundException e)
			{
				System.out.println(e.getMessage());
			}
			catch (IOException e)
			{
				System.out.println (e.getMessage());
			}
			
			for (int i = 0; i < zeilen; zeilen.size(); i++)
			{
				System.out.println(zeilen.get(i));
			}
		}
	}
}
```


----------



## SlaterB (13. Jan 2011)

wie würdest du es denn in VB programmieren?, 
poste dazu Code oder erzähle in Worten wie du vorgehen willst, dann kann man ja die fehlenden Java-Befehle suchen


----------



## Landei (13. Jan 2011)

```
ArrayList<String> zeilen = ...
for(int i = 0; i < zeilen.length; i++) {
   String zeile = zeilen.get(i);
   int zeilenNummer = i + 1;
   int anzahlWorte = zeile.split("\\s").length;
   int anzahlZeichen = zeile.length;
   int anzahlZeichenOhneWhitespaces = zeile.replace("\\s","").length;
}
```


----------



## Wrakas (13. Jan 2011)

Landei hat gesagt.:


> ```
> ArrayList<String> zeilen = ...
> for(int i = 0; i < zeilen.length; i++) {
> String zeile = zeilen.get(i);
> ...



Kleine korrekturen damit es läuft:

```
for(int i = 0; i < zeilen.size(); i++) { 	   
   String zeile = zeilen.get(i);
   int zeilenNummer = i + 1;
   int anzahlWorte = zeile.split("\\s").length;
   int anzahlZeichen = zeile.length();
   int anzahlZeichenOhneWhitespaces = zeile.replace(" ","").length();
   //optional
   System.out.println("Zeile: " + zeilenNummer + "; Worte: " + anzahlWorte + "; Zeichen: " + anzahlZeichen + "; Zeichen ohne Whitespaces: " + anzahlZeichenOhneWhitespaces);
}
```


----------



## Landei (13. Jan 2011)

ups...


----------



## karuchalr (13. Jan 2011)

Hallo!
Vielen Dank! für schnelle Antwort! es hat funktioniert!  nun habe ich gesehen, dass das Programm liest jeweils eine Zeile und unter der eingelesen Zeile kommt dann die Ergebnis und soweiter,
aber wie kann man das Ergibnis am ende des eingelesenes Textes anzeigen, ich meine zuerst den Text einlesen und Zeile pro Zeile auf die Konsole zeigen und nach der letzten Zeile dann die Gesamteanzahl von Zeilen, wörtern, Zeichen.

Etwas : 

asdasdasdasdssd sdaasddas sdfsdfsdfsrer rtert asds
sads weer 5z5rtzdfgdfggh rtekliit ewqewqew
dwer dgtkfg zu7fsds hfhr3w3 ewtret erttzz

anzahl zeile  : X
anzahl wörter : X
anzahl zeichen : X

Ps. Da fehl mir noch was ein ; unter Zeichen sollte man auch die sondern Zeichen zählen, nähmlich  : & § () ! ? ß % $ ' " @ = 

Vielen Dank noch mal!!!!!


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


public class NeuBeispiel
{

  public static void main (String [] args)
  {
      String line;
      ArrayList<String> zeilen = new ArrayList<String>();
      
         try
          {
             BufferedReader br = new BufferedReader (new FileReader("Text.txt"));
              
              
             while((line = br.readLine()) != null)
             {
                 zeilen.add(line);
             }
              br.close();
              
                 
          }
          catch (FileNotFoundException e)
          {
              System.out.println(e.getMessage());
          }
          catch (IOException e)
          {
              System.out.println (e.getMessage());
          }
          
          for(int i = 0; i < zeilen.size(); i++) 
          {       
          
          

          String zeile = zeilen.get(i);
          System.out.println(zeile);
          int zeilenNummer = i + 1;
          int anzahlWorte = zeile.split("\\s").length;
          int anzahlZeichen = zeile.length();
          int anzahlZeichenOhneWhitespaces = zeile.replace(" ","").length();
          
          
          System.out.println("============================================");
          System.out.println( "Anzahl der Zeile   : " + zeilenNummer);
          System.out.println( "Anzahl der Wörter  : " + anzahlWorte);
          System.out.println( "Anzahl der Zeichen : " + anzahlZeichen);
          System.out.println( "Anzahl der Zeichen ohne Whitespaces: " + anzahlZeichenOhneWhitespaces);
           
            
            
         }
   }
}
```


----------



## timbeau (13. Jan 2011)

Überlegst du auch selber wie sowas klappen könnte? 

Um etwas zu zählen braucht man einen Variable die hochgezählt wird. 


```
int anzahlWorteglobal = 0;


mach


tu

 int anzahlWorte = zeile.split("\\s").length;
anzahlWorteglobal += anzahlWorte;
```


----------



## karuchalr (14. Jan 2011)

timbeau hat gesagt.:


> Überlegst du auch selber wie sowas klappen könnte?
> 
> Um etwas zu zählen braucht man einen Variable die hochgezählt wird.
> 
> ...


Hallo Anzahlderworte, habe ich schon ich habe eine Methode geschrieben und es sieht so aus :


```
public  int  anzahlWorte()
 {
  int anzahl = 0;
  for (String zeile : ein.zeilen)
  {
    String[] split = zeile.split("\\s");
    for (int i = 0; i < split.length; i++)
    {
      String string = split[i];
      if ( string.length() > 0)
      anzahl+=1;
      
    }
  }
  return anzahl;
 }
```

Mit der Mehtode hat es geklappt , nur mit Anzahl der Zeichen , klappt es nicht und auch nicht wenn ich anzeigen will wie oft ein zeichen oder wort vorkommt.

ausserdem ich habe geschrieben dass ich noch kein Profi in java bin! habe erst vor ca. 3 Monat eangefangen


----------



## SlaterB (14. Jan 2011)

da brauchst du offensichtlich auch den anderen Code, was mich wieder zu meiner ersten Frage zurückbringt oder von den Antworten danach abschreiben

dort hast du jeweils die Anzahl pro Zeile, wie du das über alle Zahlen addieren kannst hat timbeau (nicht 'Anzahlderworte'?) geschrieben,
jede Zahl des Schleifendurchlaufs irgendwo global draufaddieren


----------



## karuchalr (14. Jan 2011)

Hallo!
ich wollte es nicht so komplizierter machen, daher hatten ich mien Beispiel nur mit einer Klasse erklärt, aber die Sache ist die:
Ich habe 5 Klasse : Einlesen, Ausgabe, Steuerung, Start und Analyse
- Also in der Klasse "Einlesen" wird ein Text (auswahl der Text wird nach parameter eingegeben " beim Debug Configuration ---> Arguments : -input=Text.txt -parameter=param.properties") aus der Festplatte eingelesen .
- Die Klasse "Ausgabe" gibt die ergebnisse des engelesenes Textes als Report (auch ein 'txt' datei) in speicher der Text auf der Festplatte   .   Das ist auch ein Parameter.!!
- Klasse "Steuerung"
- Klasse "Start" für die Methoden und Funktionen auf.
- Klasse "Analyse" , diese klasse hat für mich eine sehr wichtige rolle !!  , hier sollte der Text analysiert werden!!! das heisst : anzahl der wörter y wie oft ein wort vorkommt.																						Untersortierung  der Wörter nach Länge	
																															anzahl der zeichen y wie oft ein zeichen vorkommt (auch die Sonderzeichen)

Dazu kommt auch ich soll das die Wörter mit einem Parameter sortieren (aufstieg/abstieg)

Und nun!! wer kann mir da Helfen? wer kann dieses Aufagabe lösen???
Ich komme nicht mehr weiter habe schon verschiedene alternative ausprobiert und es funtioniert nicht!!
Ich bitte um Hilfe!!!!!

Hier die Klassecode :

```
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
 * @author KLU
 *
 */
public class Start
{

  /** dies ist die Start Methode für mytext.de
   * Sie liest die Programmparameter ein und initialiaisertt die Abläufe.
   * Dazu benutzt Sie die Klassen {@link Ausgabe}, {@link Eingabe} und {@link Analyse}
   * @param args liste von Strings als eingabeparameter
   * 
   */
  public static void main(String[] args) 
  {
    System.out.println("Ausgabe:");          // = Edicion!
    
    /*
     *  Hier werden die PARAMETER EINGELESEN
     */
    Steuerung  steuerparameter = new Steuerung();
    
    for (String startparameter : args)
    {
      if (startparameter == null) continue;
      // die ausgabedatei
      if(startparameter.startsWith("-input=") && startparameter.length() > 7)
      {
        steuerparameter.eingabeDatei = startparameter.substring(7);
        steuerparameter.ausgabeDatei = steuerparameter.eingabeDatei;
      }
//      if (startparameter.startsWith("-output=")&& startparameter.length() > 8)
//      {
//        steuerparameter.ausgabeDatei = startparameter.substring(8);
//      }
      else if (startparameter.startsWith("-parameter=") && startparameter.length() > 11)
      {
        steuerparameter.parameterDatei = startparameter.substring(11);
      }
      else
      {
        Ausgabe.logToConsole("unbekannter Parameter: "+startparameter);
      }
                 
    }
    if (steuerparameter.parameterDatei == null)
    {
      Ausgabe.logToConsole("-parameterDatei nicht eingegeben");
      return;
    }
    
    /*Einlesen der Datei
     * 
     */
    
    FileReader liesFile;                                                                // Variable zum Einlesen
    
    try
    {
      File eingabFile = new File ("U:/MyTextde/Texte/", steuerparameter.eingabeDatei);   //Dattei wird hier aufgerufen
      liesFile = new FileReader (eingabFile);                                           //liesFile
    }
    catch (FileNotFoundException e1)
    {
      Ausgabe.logToConsole("eingabeDatei'" + steuerparameter.eingabeDatei+ "' nicht gefunden : " + e1.getMessage());
      return;
    }
    
    //Text einlesen
    //parameter einlesen
    FileReader paramDatei;
    
    try
    {
      File paramFile = new File ("U:/MyTextde/Konfiguration/", steuerparameter.parameterDatei);
      paramDatei     = new FileReader (paramFile);
    }
    catch (FileNotFoundException e)
    {
      Ausgabe.logToConsole("parameterDatei"+ steuerparameter.parameterDatei + " nicht gefunden :" + e.getMessage());
      return;
    }
    try
    {
      steuerparameter.parameter = new Properties();
      steuerparameter.parameter.load(paramDatei);
    }
    catch(IOException e)
    {
      System.out.println(" parameterDatei ' " + steuerparameter.parameterDatei  + "  ' nicht lesbar: " + e.getMessage());
    }
    
    //ausgabe der Parameter
    
    Ausgabe aus = new Ausgabe(steuerparameter);
    aus.logging("Ausgabe");
    
    aus.logging(steuerparameter.parameter.toString());
    //ausgabe der Parameter
    aus.logging(" parameter "+ steuerparameter.toString());
  
    
   
    //Eingabe ein= new Eingabe (parameter);
    
    
    Einlesen einles = new Einlesen(steuerparameter, aus);
    aus.logging("Eingelesener Text:\r\n"+einles.getText());
    
    Analyse analyse = new Analyse(einles,steuerparameter,aus);
    aus.logging("Wortliste : ");
    aus.logging("----------");
    aus.logging("\n");
    for (String string : analyse.worter)
    {
      aus.logging(string);
    }
    
    
    aus.logging("\n");
    aus.logging("===================================");
    aus.logging("Anzahl Wörter: "+analyse.wortZaehlen());
  
   }
}  


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

/** In dieser Klasse, wird ein Textdatei aufgerunfen
 * und eingelesen.
 * Der Text wird in eine ArrayList eingelesen
 *
 */
public class Einlesen
{
  Steuerung st;                                 // Die Klasse "Steuerung" bekommt eine Variable namens 'st' 
  Ausgabe ausgab;                               // Klasse Ausgabe
  FileReader fileAufrufen     =  null;
  String text          =  "";
  
  public ArrayList<String> zeilen;
  
  public Einlesen(Steuerung kontrolle, Ausgabe aus)
  {
    st     =   kontrolle;
    ausgab = aus;
    init();
  }
  
  
  public String getText()
  {
    return text;
  }

  
  public void init()
  {
    File eingabeFile           =   new File ("U:/MyTextde/Texte", st.eingabeDatei);   // ruf die Datei auf
    String line;
    zeilen = new ArrayList<String>();
    try
    {
      
      BufferedReader   einlesen  =   new BufferedReader (new FileReader(eingabeFile));    // liest die Datei
      
      //String zeilen = null;          
      while ((line = einlesen.readLine()) != null)       //liest die Zeile ein
      {
        zeilen.add(line);
       
        //text += zeilen + "\r\n";
      }
      einlesen.close();
    }
    catch (IOException e)
    {
       //ausgab.logging(e.getMessage());
    }
  }
}
 

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author KLU
 * xxxx
 */
public class Ausgabe   // Ausgabe Datei (Report)
{
  Steuerung st;
  FileWriter schreibText   =  null;
  
  /** Der Konstruktor initialisiert die Ausgabe.
   * Er öffnet die Einabedate und ....
   * @param kontrolle
   */
  public Ausgabe(Steuerung kontrolle)
  {
    st     = kontrolle;
    init();
  }
  private void init()
  {
    if (st           ==     null)      return;
    if (st.parameter ==     null)      return;
    Object objekt    = st.parameter.get("ausgabe.aufdatei");
    boolean ausgabeAufDatei = Boolean.parseBoolean((String)objekt);     //Wenn es String ist , weil es ein Text ist
    if (ausgabeAufDatei)
    {
      File outFile =  new File ("U:/MyTextde/Report/", st.ausgabeDatei);     // Die Reportdatei wird in diesen eingelegt.
      try
      {
        schreibText       =  new FileWriter(outFile);
      }
      catch (IOException e)
      {
        System.out.println("Die Ausgabedatei kann nicht geöffnet werden  " + e.getMessage());
      }
    }
  }

  public  void logging(String text)
  {
    logToConsole(text);
    
    if ( schreibText == null)
      init();
    if ( schreibText != null)
      try
      {
        schreibText.write(text+"\r\n");
        schreibText.flush();
      }
      catch (IOException e)
      {
        System.out.println("In Ausgabedatei kann nicht geschrieben werden"+e.getMessage());
      }
  }

  public static void logToConsole(String text)
  {
    System.out.println(text);
  }
  
}


import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale;


public class Analyse
{
  Steuerung parameter;

  Einlesen ein;

  Ausgabe aus;

  ArrayList<String> worter = new ArrayList();
  

    
  public Analyse(Einlesen ein, Steuerung parameter, Ausgabe aus)
  {

    this.parameter = parameter;
    this.ein = ein;
    this.aus = aus;
     int i;
      for (String zeile : ein.zeilen)   // aufruf von Array List "zeilen" aus der Klasse einlesen"
      {
        
        // dass hier ist eine ganz einfache Methode von Aufzählung der Wörten.
        
        zeile = zeile.replaceAll("\\p{Punct}" , "");  // nehme die SonderZeichen raus .
        
        // zeile aufteilen in Wörter und einfügen in worter
        String[] ww = zeile.split("\\s");
              
        for (String string : ww)
        {
          if (string != null && string.length() > 0)
            worter.add(string);   // hier werden die einselne wörter gespeichert! in der neue Liste "worter"
         
        }
                   
      }
      
        
  }


   
  public int  wortZaehlen()      // ruf die ArrayList "Worter"
  {
    return worter.size();
    
  }
  
 
 /** die funktion liefert die Anzahle der Wörter des Textes
 * @return die Anzahl der Wörter im Text
 */
public  int  anzahlWorte()                   //Wörter zählen in einer eingenen Methode
 {
  int anzahl = 0;
  for (String zeile : ein.zeilen)
  {
    String[] split = zeile.split("\\s");
    for (int i = 0; i < split.length; i++)
    {
      String string = split[i];
      if ( string.length() > 0)
      anzahl+=1;
      
    }
  }
  return anzahl;
 }

 public int anzahlZeichen()     
 {
   int anzahlzz = 0;
   
   
   
   
   return anzahlzz;
 }
  
 
}


import java.util.Properties;


public class Steuerung
{
  
   String eingabeDatei   = null;
   String ausgabeDatei   = null;
   String parameterDatei = null;
   Properties parameter  = null;
   
   public String toSt()
   {
     String result  = "Steuerung[ausgabeDatei ="  + ausgabeDatei + "\n" ;
     result        += "eingabeDatei           ="  + eingabeDatei + "\n";
     result        += "parameterDatei         ="  + parameterDatei + "] "+" \n";
     result        += "ausgabeDatei           ="  + ausgabeDatei   + "]" + "\n";
     
     return result;
   }
   
}
```


----------



## timbeau (14. Jan 2011)

Wobei brauchst du Hilfe?


----------



## karuchalr (14. Jan 2011)

Beim Analyse!!

Anzahl der Zeichen und häufigkeit  und die Sortierung 


----------



## SlaterB (14. Jan 2011)

die 5 Klassen sind irrelevant, schon beim ersten Code war der BufferedReader im Grunde überflüssig, 
du könntest einfach Testdaten anlegen:

```
public class Test
{
    public static void main(String[] args)
    {
        ArrayList<String> zeilen = new ArrayList<String>();
        zeilen.add("erste");
        zeilen.add("noch eine");

        for (int i = 0; i < zeilen.size(); i++)
        {
            String zeile = zeilen.get(i);
            // ..
        }
    }
}
```
es geht nur um die Analyse der Zeilen, da hat sich noch nichts geändert,
erst musst du eine Zeile untersuchen, dann die Ergebnisse dort z.B. zu  außerhalb deklarierten Variablen dazuzählen,
das ist nichts schweres, ein Beispiel wurde quasi schon gepostet


----------



## timbeau (14. Jan 2011)

Zur Sortierung compare nutzen.


----------



## karuchalr (14. Jan 2011)

Hallo, ich meine nicht die Aufzählung von Zeilen, sondern von ZEICHEN!!!  : buchstabe, wörter und diese sonderzeichen :|


----------



## karuchalr (14. Jan 2011)

karuchalr hat gesagt.:


> Hallo, ich meine nicht die Aufzählung von Zeilen, sondern von ZEICHEN!!!  : buchstabe, nummern und diese sonderzeichen :|



Ups!
sorry meinte NUMMERN und nicht wörter!


----------



## timbeau (14. Jan 2011)

Da gibts keinen Unterschied!

Wo stehen denn die Zeichen? In jeder Zeile! Setz dich doch einfach mal hin und zähle in einer Zeile alle Zeichen. Tipp: ASCII-Nummern bei der Auswertung nutzen.


----------



## SlaterB (14. Jan 2011)

ich habe nicht vorgegeben, was du zählen sollst, dass es verschiedene Kategorien gibt ist mir durchaus bewußt,
aber bedenke: was du zählst ist doch komplett egal, schau dir diesen Code an

```
public class Test {
    public static void main(String[] args)  {
        ArrayList<String> zeilen = new ArrayList<String>();
        zeilen.add("erste");
        zeilen.add("noch eine");

        int gesamtZeilen = 0;
        int gesamtZeichen = 0;
        int gesamtSmilys = 0;
        for (int i = 0; i < zeilen.size(); i++)
        {
            String zeile = zeilen.get(i);
            int zeilenInZeile = 1;
            int zeichenInZeile = 12; // besser berechnen
            int smilysInZeile = 4; // besser berechnen
            gesamtZeichen += zeichenInZeile;
            gesamtZeilen += zeilenInZeile;
            gesamtSmilys += smilysInZeile;
        }
    }
}
```
erkennst du nicht das so einfache wie auch schon gepostete Grundprinzip?


----------



## karuchalr (14. Jan 2011)

Und dass mit dem 5 Klassen! ich weiss es ist überflüssig!! aber es wurde so gefordert! für ein bessere Einstieg in Java :'(


----------



## SlaterB (14. Jan 2011)

siehe auch mein Posting zwischendurch,
und dass die 5 Klassen für die Betrachtung der Analyse hier irrelevant sind hat doch keine Auswirkung auf dein restliches Leben,
den Code zur Analyse musst du letztlich natürlich in dein Programm an richtiger Stelle integrieren

ganz ruhig atmen, mal 2 Min. warten vor dem nächsten Posting und weniger Ausrufezeichen verwenden


----------



## karuchalr (14. Jan 2011)

jajajjajaja!!! Danke!!
aber erst mal mache ich Pause!!!!!!!!!!!!!!! 

und dann kein ! mehr 

Bis dann.


----------



## karuchalr (14. Jan 2011)

für die Zeichen habe ich dass :

```
for (String s : ein.zeilen)
     {
        int [] anzahl = new int [256];
        String []bb = s.split("\\s");
     
        
        
        for (int j = 0; j < bb.length; j++)
        {
          String string = bb[j];
          
          for (i = 0; i < string.length(); i++)
          {
            anzahl[string.charAt(i)]++;
          }              
          for (i = 0; i < 256; i++)
          {
            if ( ! Character.isIdentifierIgnorable(i))
             System.out.println((char) (i) + ": " + anzahl[i] + "\t" );
                          
          }
        }
        
               
      }
```
aber da zeig mir nicht die gesamteAnzahl , sondern einzeln


----------



## SlaterB (14. Jan 2011)

weil du dazu bisher nichts programmiert hast, es stehen dir verschiedene Wege offen, das jetzt zu tun,

z.B. alle Zahlen im Array anzahl aufaddieren, so schwer drauf zu kommen?
z.B. die früher geposteten Codes zu benutzen, etwa Anzahl Zeichen pro Zeile zählen, in einer Variablen über alle Zeilen addieren


----------



## Landei (14. Jan 2011)

Satzzeichen sind keine Rudeltiere!!!


----------



## Andi_CH (14. Jan 2011)

Das Framework ist ziemlich fraglich

- Aufteilung der Funktionalität
- Unbenutze Variablen (oder wird liesFile in Start nur dazu verwendet um zu überprüfen ob die Datei existiert?)
- Public Variablen
- Muster der Param-Datei fehlt.

Ich glaub ich geb auf.


----------

