# Zugriff von main-Klasse auf externe Klassen



## Java-Fee (25. Jun 2011)

Hallo,

ich hab einen Ordner mit 3 java-Dateien, und möchte, dass bei Aufruf der main-Klasse auf die entsprechenden Klassen zurückgegriffen wird.

Ich hatte das Programm zuerst als eine Java-Datei geschrieben, dort hat es auch tadellos funktioniert, aber beim splitten auf 3 Dateien bin ich irgendwie völlig durcheinandergekommen.

Ich möchte den Text-String aus der Main-Klasse an die Text-Klasse übergeben, dort wird sie entsprechend abgearbeitet, die dort vormals enthaltene Sortierfunktion möchte ich in einer externen Klasse haben.

Kann mir jemand helfen, wie ich die jew. Methoden am besten anspreche, bzw. welche Attribute ich mit übergeben muss...?



```
public class Aufgabe_8 {

  public static void main(String [] arg) {

    String textString = "Herr Bundespräsident, Herr Ministerpräsident, Herr Landtagspräsident, Herr Kardinal, lieber Herr Zehetmair und lieber Freund Theo Waigel!"+
	                    "Während ich mir die Reden anhöre, gingen meine Gedanken in vergangene Zeiten zurück, und ich fragte mich: 'Wann warst du zum ersten Mal in München?'"+
                        "Wenn ich mich recht entsinne, war das Ende März 1945. Ich war damals gerade 15 Jahre alt und ich befand mich als Flaghelfer in Berchtesgaden."+
                        "Wir fuhren an einem Tag von Berchtesgaden nach München, um etwas dorthin zu transportieren. Ich kannte München noch nicht und meine erste Begegnung mit der Stadt war ein Schock,"+
                        "denn sie war ein einziger Trümmerhaufen. Angesichts dieses Elends sahen weder wir Kinder noch die Erwachsenen eine positive Zukunft. Doch wir haben es geschafft!"+
                        "Diese großartige Generation meiner Eltern, der Großeltern und vielleicht der Urgroßeltern verzweifelte trotz allem nicht.";

    Text txt = new Text( textString ); // übergibt Text an Text-Methode

    txt.printWordFreqStat(); //soll die geordnete Liste ausgeben

  }

}
```


```
import java.io.*;

class Text {

	static void text(textString) {


		//Variablendefinitionen
		int textlength = 0;
		int ch;
		boolean last_was_char = false;
		String words[];
		int index;
		String[] word_count;
		int temp_zahl;
		int pos;


		//keine Textauswertung
		if (textString.length()==0) {
			System.exit(1);
		}//if

		//in Kleinbuchstaben umwandeln
		textString = textString.toLowerCase();

		//Wortanzahl ermitteln
		for (int i=0; i<textString.length(); i++) {
			//Zeichen als ASCII-Code speichern
			ch = (int)textString.charAt(i);

			//wenn Zeichen Buchstabe ist
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				//--> letztes Zeichen ist Buchstabe
				last_was_char = true;
			}//if
			else if(last_was_char){
				//letztes Zeichen kein Buchstabe
				last_was_char = false;
				//-->Wort zuende
				textlength++;
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for


		//Array aus Strings mit der Anzahl der Woerter erstellen
		words = new String[textlength];

		//variablen initialisieren
		words[0] = "";
		last_was_char = false;
		index = 0;

		//Woerter einzeln in String-Array words ablegen
		for (int i=0; i<text.length(); i++) {
			ch = (int)text.charAt(i);
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				last_was_char = true;
				words[index] +=	text.charAt(i);
			}//if
			else if(last_was_char){
				last_was_char = false;
				index++;
				if (index < textlength)
				words[index] = "";
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for

		//Array alphabetisch sortieren
		java.util.Arrays.sort( words );

        //Aufruf der Sortierfunktion
		SelectionSort.selSort( words );

		//



	}//text

}//class
```


```
class SelectionSort {

   /** static void selSort(String[] str, int[] freq) {
    	int j;
    	for (int i = 1; i < freq.length; i++) {
    		j = maxIndex (freq,i);
    		swap (freq, i, j);
    		swap (str, i, j);
    	}
    }

    static void swap (int[] a, int i, int j) {
    	int buffer = a[i];
    	a[i] = a[j];
    	a[j] = buffer;
    }*/



   /**
	* Ermitteln der Worthäufigkeit
 	* Fuer jedes Wort wird die Anzahl angegeben
 	* In Array Word_count eingetragen als: "ANZAHL"_"WORT"
	*/

	static void selSort() {

		//initialisieren der Variablen
		word_count = new String[textlength];
		temp_zahl = 1;
		pos = 0;

		for (int i=0; i<index; i++) {
			word_count[i] = "_";
			if (words[i].equals(word_count[pos])) {
				temp_zahl++;
				if (i==index-1) {
					word_count[pos] = temp_zahl + "_" +word_count[pos];
				}//if
			}//if
			else {
				if (i > 0) {
					word_count[pos] = temp_zahl + "_" +word_count[pos];
					pos++;
					temp_zahl = 1;
				}//if
				word_count[pos] = words[i];
				if (i==index-1) {
					word_count[pos] = temp_zahl + "_" +word_count[pos];
				}//if
			}//else
		}//for

		//Array Word_count nach der Anzahl sortieren
		java.util.Arrays.sort( word_count );

		//Variablen initialisieren
		int i=pos;

		while (true) {

			//Array temp ist von der Groesse 2 und enthalt das aktuelle Wort und seine Anzahl
			String temp[] = word_count[i].split("_");

			//falls weniger als 10 Woerter enthalten sind
			if(i==0) {
				System.out.println(temp[1] + " " + temp[0] + " " +
					(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );
				break;
			}//if
			//sonst die ersten Zehn ausgeben
			else if ((i <= pos-9)) {
				String temp2[] = word_count[pos-9].split("_");
				if (Integer.parseInt(temp[0]) < Integer.parseInt(temp2[0]) ) {
					break;
				}//if
			}//else if
			System.out.println(temp[1] + " " + temp[0] + " " +
				(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );

			i--;
		}//while   

		//Rückgabe Anzahl Wörter
		System.out.println(+textlength);
	}
}
```

Die printWordFreqStat Methode ist ja quasi der Inhalt der while-Schleife. Wie kann ich die am einfachsten als Methode verpacken, einfach: 

```
static void printWordFreqStat {}
```
 ?


----------



## Camino (25. Jun 2011)

Wenn du in der main das so aufrufst:

```
Text txt = new Text( textString );
```
Dann brauchst du so etwa eine solche Text-Klasse (grob vereinfacht):

```
public class Text {

    private String meinText;

    // Konstruktor
    public Text(String meinText) {

    this.meinText = meinText;  // übergebener Parameter an Objektvariable zuweisen

    }


    // Dann kommen weitere Methoden, in denen du
    // auf die Objektvariable meinText zugreifen kannst.

}
```


----------



## Java-Fee (25. Jun 2011)

...aber ich muss doch keinen neuen Tsring initialisieren, wenn ich den String "textString" verwenden wil, oder? Der wird ja in der main-Klasse angegeben...


----------



## Camino (25. Jun 2011)

Kommt halt darauf an, was du mit dem übergebenen String in der Klasse Text machen möchtest. Wenn du weitere Methoden erstellst und dann auf den String zugreifen möchtest, solltest du ihn als Objektvariable zuweisen.


----------



## Java-Fee (25. Jun 2011)

...naja, nicht viel. 

In der Klasse Text sollen die Methoden zum normalisieren, ordnen und sortieren von dem übergebenen Text stehen. An sich stehen sie ja schon da.

Lediglich die Methode SelectionSort soll in einer separaten Klasse vorhanden sein.


----------



## Java-Fee (26. Jun 2011)

...ich hab die einzelnen Sachen nochmal durchgeschaut, bin, um Fehlereinzugrenzen, erstmal wieder von der externen Klasse zum Sortieren weg.

Die beiden Klassen sollten eigentlich laufen (dachte ich), zumindest kompiliert JCreator die Klasse Text fehlerfrei. Beim Aufruf über die main-Klasse gibts wohl ein Problem mit der Methodenbezeichnung, wie kann ich das umgehen...? (ich bekomme da " invalid method declaration", "identifier expected" und "cannot find symbol")


```
public class Aufgabe_8 {

  public static void main(String [] arg) {

    String textString = "Herr Bundespräsident, Herr Ministerpräsident, Herr Landtagspräsident, Herr Kardinal, lieber Herr Zehetmair und lieber Freund Theo Waigel!"+
	                    "Während ich mir die Reden anhöre, gingen meine Gedanken in vergangene Zeiten zurück, und ich fragte mich: 'Wann warst du zum ersten Mal in München?'"+
                        "Wenn ich mich recht entsinne, war das Ende März 1945. Ich war damals gerade 15 Jahre alt und ich befand mich als Flaghelfer in Berchtesgaden."+
                        "Wir fuhren an einem Tag von Berchtesgaden nach München, um etwas dorthin zu transportieren. Ich kannte München noch nicht und meine erste Begegnung mit der Stadt war ein Schock,"+
                        "denn sie war ein einziger Trümmerhaufen. Angesichts dieses Elends sahen weder wir Kinder noch die Erwachsenen eine positive Zukunft. Doch wir haben es geschafft!"+
                        "Diese großartige Generation meiner Eltern, der Großeltern und vielleicht der Urgroßeltern verzweifelte trotz allem nicht.";

    Text txt = new Text( textString ); // übergibt Text an Text-Methode

    //txt.printWordFreqStat(); //soll die geordnete Liste ausgeben

  }

}
```


```
import java.io.*;

 class Text {

        static void Text (String textString) {

        //Attribute
        //String textString;

	    //Konstruktor
     	//public Text (String textString) {
     	//this.textString = textString; /**Parameter an Objektvariable zuweisen*/
     	//}

		//Variablendefinitionen
		int textlength = 0;
		int ch;
		boolean last_was_char = false;
		String[] word;
		int index;
		String[] freq;
		int temp_zahl;
		int pos;

		/**in Kleinbuchstaben umwandeln*/
		textString = textString.toLowerCase();

		/**Wortanzahl ermitteln*/
		for (int i=0; i<textString.length(); i++) {
			/**Zeichen als int casten*/
			ch = (int)textString.charAt(i);

			//wenn Zeichen Buchstabe ist
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				//--> letztes Zeichen ist Buchstabe
				last_was_char = true;
			}//if
			else if(last_was_char){
				//letztes Zeichen kein Buchstabe
				last_was_char = false;
				//-->Wort zuende
				textlength++;
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for


		//Array aus Strings mit der Anzahl der Woerter erstellen
		word = new String[textlength];

		//variablen initialisieren
		word[0] = "";
		last_was_char = false;
		index = 0;

		//Woerter einzeln in String-Array word ablegen
		for (int i=0; i<textString.length(); i++) {
			ch = (int)textString.charAt(i);
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				last_was_char = true;
				word[index] +=	textString.charAt(i);
			}//if
			else if(last_was_char){
				last_was_char = false;
				index++;
				if (index < textlength)
				word[index] = "";
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for

		//Array alphabetisch sortieren
		java.util.Arrays.sort( word );

		//initialisieren der Variablen
		freq = new String[textlength];
		temp_zahl = 1;
		pos = 0;

		/**
		 * Ermitteln der Worthäufigkeit
 		 * Fuer jedes Wort wird die Anzahl angegeben
 		 * In Array Word_count eingetragen als: "ANZAHL"_"WORT"
		 */
		for (int i=0; i<index; i++) {
			freq[i] = "_";
			if (word[i].equals(freq[pos])) {
				temp_zahl++;
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//if
			else {
				if (i > 0) {
					freq[pos] = temp_zahl + "_" +freq[pos];
					pos++;
					temp_zahl = 1;
				}//if
				freq[pos] = word[i];
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//else
		}//for

		//Array Word_count nach der Anzahl sortieren
		java.util.Arrays.sort( freq );

		//Variablen initialisieren
		int i=pos;


		while (true) {

			//Array temp ist von der Groesse 2 und enthalt das aktuelle Wort und seine Anzahl
			String temp[] = freq[i].split("_");

			//falls weniger als 10 Woerter enthalten sind
			if(i==0) {
				System.out.println(temp[1] + " " + temp[0] + " " +
					(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );
				break;
			}//if
			//sonst die ersten Zehn ausgeben
			else if ((i <= pos-9)) {
				String temp2[] = freq[pos-9].split("_");
				if (Integer.parseInt(temp[0]) < Integer.parseInt(temp2[0]) ) {
					break;
				}//if
			}//else if
			System.out.println(temp[1] + " " + temp[0] + " " +
				(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );

			i--;
		}//while

		//Ausgabe Anzahl Wörter
		System.out.println("Wortzahl: "+textlength);
	}//main

}//class
```

...nächster Schritt wäre dann die Sortiermethode auslagern sowie den Befehl txt-printWordFreqStat impelemntieren, ich denke dass wird eine Methode für die Ausgabe der Worthäufigkeit darstellen. Leider funzt in meinem Prog die limitierung auf die 10 häufigsten Wörter noch nicht, vielleicht weiss da auch jemand, woran es liegt....


----------



## Camino (26. Jun 2011)

Na ja, wie schon oben geschrieben ist deine Text-Klasse so nicht OK:

```
...
class Text {
 
        static void Text (String textString) {
...
```


```
static void Text (String textString)
```
 ist eine Methode, die den gleichen Namen wie die Klasse (Text) hat.

Du brauchst entweder einen Konstruktor oder eine Methode, dem/der du deinen textString übergibst. Du kannst das ja testweise einfach mal so probieren (und dann erweitern):

```
public class Text2 {
 
    private String meinText;
 
    // Konstruktor
    public Text2(String uebergebenerText) {
 
        this.meinText = uebergebenerText;  // übergebener Parameter an Objektvariable zuweisen

        ausgabe();  // Methode aufrufen zur Ausgabe der Objektvariable auf der Konsole
 
    }
 
 
    public void ausgabe() {
        system.out.println(meinText);
    } 
}
```

Und in deiner main rufst du das dann so auf:

```
Text2 txt = new Text2( textString );
```


----------



## thorstennn (26. Jun 2011)

Was genau soll die Text-Klasse denn machen bzw. welche Methoden soll sie beinhalten? Nur die Häufigkeiten der Wörter zählen?

Das ließe sich einfache realisieren...

Und wie lautet Aufgabe 8?


----------



## thorstennn (26. Jun 2011)

```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EinfachesZählen {

    private static final Pattern WORD_PAT = Pattern.compile("[\\wäöüÄÖÜß]+");

    public static HashMap<String, Integer> getWordFrecMap(String str) {
        HashMap<String, Integer> res = new HashMap<String, Integer>(str.length() / 2);
        Matcher m = WORD_PAT.matcher(str);
        while (m.find()) {
            String s = m.group().toLowerCase();
            if (res.containsKey(s)) {
                res.put(s, res.get(s) + 1);
            } else {
                res.put(s, 1);
            }
        }
        return res;
    }

    public static String readText(String filename) {
        StringBuilder strb = new StringBuilder();
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(filename));
            String line;
            while ((line = in.readLine()) != null) {
                strb.append(line);
                strb.append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return strb.toString();
    }

    public static void main(String[] args) {
        HashMap<String, Integer> map = getWordFrecMap(readText("Rede.txt"));
        Object[] arr = map.entrySet().toArray();
        Arrays.sort(arr, new Comparator<Object>() {

            public int compare(Object o1, Object o2) {
                int i1 = ((Map.Entry<String, Integer>) o1).getValue();
                int i2 = ((Map.Entry<String, Integer>) o2).getValue();
                return i1 < i2 ? -1 : i1 > i2 ? 1 : 0;
            }
        });
        System.out.println(Arrays.toString(arr));
    }
}
```


----------



## Java-Fee (26. Jun 2011)

@Camino: Mit dem Konstruktor muss ich dann aber immer auch den Textstring so ansprechen? Also "this.textString"...?

@thorstenn: Aufgabenstellung lautet, aufbauend auf der main-Datei (aufgabe_8, siehe oben) eine Klasse "Text" sowie eine Klasse "SelectionSort" erstellen, die den in der Main-Methode angegebenen Text übernimmt, auswertet, sowie die Arrays (die man infolgedessen für die verschd. Wörter und deren Häufigkeiten angelegt hat) nach der Häufigkeit sortiert und die 10 häufigsten Wörter mitsamt deren Häufigkeit ausgibt.

Klingt einfach, ein Java-Programm, dass alles in einer Datei macht, hatte ich ja schon, aber ich komme mit dem übergeben von einer Klasse zur nächsten nicht klar.

Da die Sortierfunktion in der obigen Klasse "Text" noch drin ist, hoffe ich erstmal dass mir jemand hilft wie ich in der Klasse mit dem "textString" aus der Main-Klasse arbeiten kann - siehe das Problem oben. Camino versucht mir ja schon zu helfen, aber ich steh da komplett auf dem schlauch...


----------



## bLaSt (26. Jun 2011)

Java-Fee hat gesagt.:


> @Camino: Mit dem Konstruktor muss ich dann aber immer auch den Textstring so ansprechen? Also "this.textString"...?
> 
> @thorstenn: Aufgabenstellung lautet, aufbauend auf der main-Datei (aufgabe_8, siehe oben) eine Klasse "Text" sowie eine Klasse "SelectionSort" erstellen, die den in der Main-Methode angegebenen Text übernimmt, auswertet, sowie die Arrays (die man infolgedessen für die verschd. Wörter und deren Häufigkeiten angelegt hat) nach der Häufigkeit sortiert und die 10 häufigsten Wörter mitsamt deren Häufigkeit ausgibt.
> 
> ...



Um die Antwort vorneweg zu nehmen, ja du musst das so machen. Da du ja sagen willst,dass deine obere deklarierte Variable, sie kann notfalls auch ebenfalls so heißen wie du sie in der main Methode bezeichnest, genau diese Variable ist, die durch den Konstruktor übergeben wird. Und mit dem selbstdefinierten Konstruktor hast du halt den Vorteil,dass beim erzeugen deines Objektes an diesen Anweisungen nichts vorbeiführt. Um im darauffolgenden auf deine Methoden zu zu greifen musst du normalerweise folgende Syntax verwenden: "Objektnname.MethodenName();"
Denn du möchtest deine Methoden aus anderen Klassen ja für ein bestimmtes Objekt verwenden


----------



## Java-Fee (26. Jun 2011)

Also ich hab jetzt 2 entsprechende Klassen, die lassen sich jeweils auch fehlerfrei compilieren. Was fehlt denn jetzt noch damit bei aufruf der Klasse Aufgabe_8 auch die Klasse Text entsprechend abgearbeitet wird...? Der String (Namens "textString") sollte doch richtig übergeben werden....

Aufgabe_8:

```
public class Aufgabe_8 {

  public static void main(String [] arg) {

    String textString = "Herr Bundespräsident, Herr Ministerpräsident, Herr Landtagspräsident, Herr Kardinal, lieber Herr Zehetmair und lieber Freund Theo Waigel!"+
	                    "Während ich mir die Reden anhöre, gingen meine Gedanken in vergangene Zeiten zurück, und ich fragte mich: 'Wann warst du zum ersten Mal in München?'"+
                        "Wenn ich mich recht entsinne, war das Ende März 1945. Ich war damals gerade 15 Jahre alt und ich befand mich als Flaghelfer in Berchtesgaden."+
                        "Wir fuhren an einem Tag von Berchtesgaden nach München, um etwas dorthin zu transportieren. Ich kannte München noch nicht und meine erste Begegnung mit der Stadt war ein Schock,"+
                        "denn sie war ein einziger Trümmerhaufen. Angesichts dieses Elends sahen weder wir Kinder noch die Erwachsenen eine positive Zukunft. Doch wir haben es geschafft!"+
                        "Diese großartige Generation meiner Eltern, der Großeltern und vielleicht der Urgroßeltern verzweifelte trotz allem nicht.";

    Text txt = new Text( textString ); /** übergibt Text an Text-Methode */

    //txt.printWordFreqStat(); /** soll die geordnete Liste ausgeben */

  }

}
```

Text:

```
import java.io.*;

public class Text {


	//Konstruktor
	public Text (String textString) {


		//Variablendefinitionen
		int textlength = 0;
		int ch;
		boolean last_was_char = false;
		String[] words;
		int index;
		String[] freq;
		int temp_zahl;
		int pos;

		/** in Kleinbuchstaben umwandeln */
		textString = textString.toLowerCase();

		/** Wortanzahl ermitteln */
		for (int i=0; i<textString.length(); i++) {
			//Zeichen als ASCII-Code speichern
			ch = (int)textString.charAt(i);

			//wenn Zeichen Buchstabe ist
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				//--> letztes Zeichen ist Buchstabe
				last_was_char = true;
			}//if
			else if(last_was_char){
				//letztes Zeichen kein Buchstabe
				last_was_char = false;
				//-->Wort zuende
				textlength++;
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for


		/** Array aus Strings mit der Anzahl der Woerter erstellen */
		words = new String[textlength];

		//variablen initialisieren
		words[0] = "";
		last_was_char = false;
		index = 0;

		//Woerter einzeln in String-Array words ablegen
		for (int i=0; i<textString.length(); i++) {
			ch = (int)textString.charAt(i);
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				last_was_char = true;
				words[index] +=	textString.charAt(i);
			}//if
			else if(last_was_char){
				last_was_char = false;
				index++;
				if (index < textlength)
				words[index] = "";
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for

		//Array alphabetisch sortieren
		java.util.Arrays.sort( words );

		//initialisieren der Variablen
		freq = new String[textlength];
		temp_zahl = 1;
		pos = 0;

		/**
		 * Ermitteln der Worthäufigkeit
 		 * Fuer jedes Wort wird die Anzahl angegeben
 		 * In Array Word_count eingetragen als: "ANZAHL"_"WORT"
		 */
		for (int i=0; i<index; i++) {
			freq[i] = "_";
			if (words[i].equals(freq[pos])) {
				temp_zahl++;
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//if
			else {
				if (i > 0) {
					freq[pos] = temp_zahl + "_" +freq[pos];
					pos++;
					temp_zahl = 1;
				}//if
				freq[pos] = words[i];
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//else
		}//for

		//Array Word_count nach der Anzahl sortieren
		java.util.Arrays.sort( freq );

		//Variablen initialisieren
		int i=pos;


		while (true) {

			//Array temp ist von der Groesse 2 und enthalt das aktuelle Wort und seine Anzahl
			String temp[] = freq[i].split("_");

			//falls weniger als 10 Woerter enthalten sind
			if(i==0) {
				System.out.println(temp[1] + " " + temp[0] + " " +
					(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );
				break;
			}//if
			//sonst die ersten Zehn ausgeben
			else if ((i <= pos-9)) {
				String temp2[] = freq[pos-9].split("_");
				if (Integer.parseInt(temp[0]) < Integer.parseInt(temp2[0]) ) {
					break;
				}//if
			}//else if
			System.out.println(temp[1] + " " + temp[0] + " " +
				(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );

			i--;
		}//while

		//Ausgabe Anzahl Wörter
		System.out.println("Wortzahl: "+textlength);
	}//main

}//class
```


----------



## Java-Fee (26. Jun 2011)

@blast: Alles klar, habs grad erst gelesen. So wie oben geht es nicht?

Dann müsste es doch reichen, folgendes einzufügen:


```
public class text
  
   private String text;
   
   //Konstruktor
   public text (String textString) {
   this.text = textString;
   }
```

und darunter dann alle Anweisungen/Methoden, wo ich mit this.text weiterarbeite...?


----------



## jgh (26. Jun 2011)

in der Klasse [c]text[/c] *btw Klassennamen schreibt man groß!!!* kannst du auch ohne 
	
	
	
	





```
this
```
mit 
	
	
	
	





```
text
```
auf den Text zugreifen.


----------



## Java-Fee (26. Jun 2011)

...sorry, das war ein Tipfehler.

Ich habs jetzt geändert, natürlich muss ich nun die ganzen Anweisungen in eine Methode verpacken, nur weiss ich nicht was für einen Datentyp ich da angebe - int, für die Rückgabe von textlength am schluss, oder geht das auch mit void? Wenn ich void nehme, meckert JCreator wegen der Methodenbezeichnung und sagt "identifier expected"...


```
import java.io.*;

public class Text {


    private String text;

    //Konstruktor
	public Text (String textString) {
    this.text = textString;
	}

	//Methoden
	void Text (text) {

		//Variablendefinitionen
		int textlength = 0;
		int ch;
		boolean last_was_char = false;
		String[] words;
		int index;
		String[] freq;
		int temp_zahl;
		int pos;

		/** in Kleinbuchstaben umwandeln */
		text = text.toLowerCase();

		/** Wortanzahl ermitteln */
		for (int i=0; i<text.length(); i++) {
			/** Zeichen als ASCII-Code speichern */
			ch = (int)text.charAt(i);

			//wenn Zeichen Buchstabe ist
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				/** letztes Zeichen ist Buchstabe */
				last_was_char = true;
			}//if
			else if(last_was_char){
				/** letztes Zeichen kein Buchstabe */
				last_was_char = false;
				/** Wortende */
				textlength++;
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for


		/** Array aus Strings mit der Anzahl der Woerter erstellen */
		words = new String[textlength];

		/** Variablen initialisieren */
		words[0] = "";
		last_was_char = false;
		index = 0;

		/** Wörter einzeln in String-Array words ablegen */
		for (int i=0; i<text.length(); i++) {
			ch = (int)textString.charAt(i);
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				last_was_char = true;
				words[index] +=	text.charAt(i);
			}//if
			else if(last_was_char){
				last_was_char = false;
				index++;
				if (index < textlength)
				words[index] = "";
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for

		/** Array alphabetisch sortieren */
		java.util.Arrays.sort( words );

		/** Initialisieren der Variablen */
		freq = new String[textlength];
		temp_zahl = 1;
		pos = 0;

		/**
		 * Ermitteln der Worthäufigkeit
 		 * Fuer jedes Wort wird die Anzahl angegeben
 		 * In Array freq eingetragen als: "ANZAHL"_"WORT"
		 */
		for (int i=0; i<index; i++) {
			freq[i] = "_";
			if (words[i].equals(freq[pos])) {
				temp_zahl++;
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//if
			else {
				if (i > 0) {
					freq[pos] = temp_zahl + "_" +freq[pos];
					pos++;
					temp_zahl = 1;
				}//if
				freq[pos] = words[i];
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//else
		}//for

		/** Array freq nach der Anzahl sortieren */
		java.util.Arrays.sort( freq );

		/** Variablen initialisieren */
		int i=pos;


		while (true) {

			/** Array temp enthält das aktuelle Wort und die Häufigkeit */
			String temp[] = freq[i].split("_");

			/** falls weniger als 10 Wörter enthalten sind */
			if(i==0) {
				System.out.println(temp[1] + " " + temp[0] + " " +
					(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );
				break;
			}//if
			/** sonst die ersten Zehn ausgeben */
			else if ((i <= pos-9)) {
				String temp2[] = freq[pos-9].split("_");
				if (Integer.parseInt(temp[0]) < Integer.parseInt(temp2[0]) ) {
					break;
				}//if
			}//else if
			System.out.println(temp[1] + " " + temp[0] + " " +
				(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );

			i--;
		}//while

		//Ausgabe Anzahl Wörter
		System.out.println("Wortzahl: "+textlength);

	}//main

}//class
```


----------



## Marcinek (26. Jun 2011)

Galileo Computing :: Java ist auch eine Insel – 2.7 Methoden einer Klasse

Programmieren hat nix mit raten zu tun 

-.-


----------



## jgh (26. Jun 2011)

[JAVA=14]void Text (String text) {[/code]
*btw. Methodennamen auch klein *

[java=61]	ch = (int) text.charAt(i);[/code]


----------



## Hase123 (26. Jun 2011)

jgh hat gesagt.:


> [JAVA=14]void Text (String text) {[/code]
> *btw. Methodennamen auch klein *



Damit das dann einmal erwähnt ist: NO TITLE


----------



## bLaSt (26. Jun 2011)

jgh hat gesagt.:


> in der Klasse [c]text[/c] *btw Klassennamen schreibt man groß!!!* kannst du auch ohne
> 
> 
> 
> ...



Ja, solange sich die definierte Variable von der in der Methode übergebenen unterscheidet, da haste vollkommen recht, da braucht man kein this. Aber wenn die Bezeichnung gleich ist muss man es machen um die Referenz aufs aktuelle Objekt deutlich zu machen


----------



## Java-Fee (26. Jun 2011)

@Marcinek: Danke, das Vuch hab ich auch, aber ich poste nicht umsonst unter Anfänger-Fragen. Wenn ich weiterhin die Zeit hätte, alle mir vorliegenden Bücher zu studieren, würde ich auch keinen damit belasten.

Da hier aber meistens Fachmänner unterwegs sind, die schnell und zielgerichtet Tips geben können, habe ich gefragt.

Nach den letzten Posts weiss ich genauso viel wie vorher, auch wenn die Ratschläge gut sind. Aber kann ich die Methode jetzt auch 

static String (text) nennen, oder wie? Ich will ja nur, dass der in der Klasse "Aufgabe_8" angegebene string in der Klasse "Text" bearbeitet wird....


----------



## bLaSt (26. Jun 2011)

Also es ist sehr schwer dir hier zu helfen,weil viele elementare Fehler in deinem Code sind. Deine Konstruktordefinition ist nicht schlüssig. Was willst du damit überhaupt erreichen? In deinem Grundcode vom ersten Post fehlt schon mal dein return Statement deines Konstruktors. Du solltest dir mal dringend anschauen wie ein Konstruktor aufgebaut ist. Grad auf dem Link den Marcinek gepostet hat in java ist auch insel. Ich könnt dir das zwar ez alles verbessern, aber dein Lerneffekt wäre gleich 0.
Wie gesagt schau dir das nochmal genau an, vorallem auch das mit dem Call by Value und Call by Reference und der this-Anweisung.


----------



## bLaSt (26. Jun 2011)

Java-Fee hat gesagt.:


> @Marcinek: Danke, das Vuch hab ich auch, aber ich poste nicht umsonst unter Anfänger-Fragen. Wenn ich weiterhin die Zeit hätte, alle mir vorliegenden Bücher zu studieren, würde ich auch keinen damit belasten.
> 
> Da hier aber meistens Fachmänner unterwegs sind, die schnell und zielgerichtet Tips geben können, habe ich gefragt.
> 
> ...



Du versuchst ja einen Konstruktor aufzurufen, der gar nicht definiert ist. Da der String an Aufgabe_8 übergeben werden soll, musst du natürlich auch ein neues Aufgabe_8 Objekt erzeugen um dort den Konstruktor aufzurufen. Ich habs ez mal verbessert.

```
public class Text {

	public static void main(String [] arg) {
		 .
                 .
                 .
		 
 Aufgabe_8 txt = new Aufgabe_8( textString );
}
}
```


----------



## Java-Jan (26. Jun 2011)

Java-Fee hat gesagt.:


> @Marcinek: Danke, das Vuch hab ich auch, aber ich poste nicht umsonst unter Anfänger-Fragen. Wenn ich weiterhin die Zeit hätte, alle mir vorliegenden Bücher zu studieren, würde ich auch keinen damit belasten.
> 
> Da hier aber meistens Fachmänner unterwegs sind, die schnell und zielgerichtet Tips geben können, habe ich gefragt.
> 
> ...




Weißt du wo du auch Fachmänner findest, die dir helfen können? In deiner Laborübung 

Was an deinem zuletzt geposteten Quelltext nicht OK ist, ist der Name der Methode. Nur Konstruktoren dürfen so heißen wie die Klasse selbst. Nenn die Methode z.B. printWordFreqStat() (was ja zufällig die Methode ist, die aus der Main aufgerufen wird) 
Den Text musst du der Methode nicht mehr übergeben, da er ja bei der Erzeugung eines Text-Objekts im Attribut "text" gespeichert wird. 



bLaSt hat gesagt.:


> Also es ist sehr schwer dir hier zu helfen,weil viele elementare Fehler in deinem Code sind. Deine Konstruktordefinition ist nicht schlüssig. Was willst du damit überhaupt erreichen? In deinem Grundcode vom ersten Post fehlt schon mal dein return Statement deines Konstruktors. Du solltest dir mal dringend anschauen wie ein Konstruktor aufgebaut ist. Grad auf dem Link den Marcinek gepostet hat in java ist auch insel. Ich könnt dir das zwar ez alles verbessern, aber dein Lerneffekt wäre gleich 0.
> Wie gesagt schau dir das nochmal genau an, vorallem auch das mit dem Call by Value und Call by Reference und der this-Anweisung.



Return-Anweisung im Konstruktor? Call-by-reference in Java? Vielleicht solltest du selbst nochmal nachlesen.


----------



## bLaSt (26. Jun 2011)

Java-Jan hat gesagt.:


> Weißt du wo du auch Fachmänner findest, die dir helfen können? In deiner Laborübung
> 
> Was an deinem zuletzt geposteten Quelltext nicht OK ist, ist der Name der Methode. Nur Konstruktoren dürfen so heißen wie die Klasse selbst. Nenn die Methode z.B. printWordFreqStat() (was ja zufällig die Methode ist, die aus der Main aufgerufen wird)
> Den Text musst du der Methode nicht mehr übergeben, da er ja bei der Erzeugung eines Text-Objekts im Attribut "text" gespeichert wird.
> ...



Du hast mich falsch verstanden. Ich habe nicht behauptet,dass es das gibt in Java, aber er sollte dennoch den unterschied kennen. Bezüglich der return-Anweisung, dass war nur die Fehleranzeige in Eclipse,weil Eclipse es net gepeilt hat das das ein Konstruktor sein soll. Ich habs halt reingeschrieben ohne drüber nachzudenken. Und man muss net gleich so unfreundlich werden zumal in meinem darauffolgenden Post hab ich ihm ja den verbesserungsvorschlag gegeben der nichts mit nem return zu tun hatte


----------



## Gerlon (26. Jun 2011)

```
MAIN!
  Text2 txt = new Text2( textString);
  txt.printWordFreqStat();

---------------------------------
KLASSE TEXT!
 private String textstring;
 
    //Konstruktor
    public Text2 (String textString) {
    this.textstring = textString;
    }
 
    //Methoden
public void printWordFreqStat() {
```

so sollte die übergabe passen, musst dann noch die variable text ändern in textstring
hatte es bei mir mal angepasst dein Programm und funktioniert soweit, fehlt nur noch die Auslagerung der Sortierfunktion.


----------



## Camino (26. Jun 2011)

bLaSt hat gesagt.:


> Du versuchst ja einen Konstruktor aufzurufen, der gar nicht definiert ist. Da der String an Aufgabe_8 übergeben werden soll, musst du natürlich auch ein neues Aufgabe_8 Objekt erzeugen um dort den Konstruktor aufzurufen. Ich habs ez mal verbessert.
> 
> ```
> public class Text {
> ...


Ich glaube, bei dem Tipp hast du auch etwas durcheinander gebracht. Die main-Methode ist in Klasse Aufgabe_8 und dort wird auch dann ein neues Objekt der Klasse Text erstellt und dem Konstruktor von Text ein String mit übergeben. Nur damit Java-Fee jetzt 
nicht noch dadurch verwirrt werden sollte...


----------



## Gerlon (26. Jun 2011)

deswegen habe ich die Trennlinie eingefügt dachte ist klar dass das in der main ist....


----------



## Marcinek (26. Jun 2011)

Java-Fee hat gesagt.:


> @Marcinek: Danke, das Vuch hab ich auch, aber ich poste nicht umsonst unter Anfänger-Fragen. Wenn ich weiterhin die Zeit hätte, alle mir vorliegenden Bücher zu studieren, würde ich auch keinen damit belasten.
> 
> Da hier aber meistens Fachmänner unterwegs sind, die schnell und zielgerichtet Tips geben können, habe ich gefragt.
> 
> ...



Natürlich können wir Tipps geben, aber was bringt dir das? 90 % dessen, was hier geschrieben wird, verstehst du nicht, weil die die ersten Kapitel in Java fehlen. Das Forum ist kein Ersatz für Bücher oder das Lernen von Grundlagen. 

Das Forum ist auch keine interaktive Suchmaschine für Sachen, die einfach überall schon stehen.

Lese dir durch, wie man Methoden deklariert, dann wirst du die Antwort schnell finden. :rtfm:


----------



## Camino (26. Jun 2011)

Gerlon hat gesagt.:


> deswegen habe ich die Trennlinie eingefügt dachte ist klar dass das in der main ist....


Sorry, warst nicht du gemeint, sondern das zitierte Posting von bLaSt...


----------



## Gerlon (26. Jun 2011)

Anzahl der Wörter stimmt nicht, Normalisierung muss verändert werden !


----------



## bLaSt (26. Jun 2011)

Camino hat gesagt.:


> Ich glaube, bei dem Tipp hast du auch etwas durcheinander gebracht. Die main-Methode ist in Klasse Aufgabe_8 und dort wird auch dann ein neues Objekt der Klasse Text erstellt und dem Konstruktor von Text ein String mit übergeben. Nur damit Java-Fee jetzt
> nicht noch dadurch verwirrt werden sollte...



Achso ok, ja so wie er es halt definiert hatte zu Beginn war die main-Methode in der andern Klasse, wenn man es so betrachtet hast du vollkommen recht. Ich hab halt seinen Code übernommen.
Klar die main-Methode gerhört eigentlich in die Klasse Text rein, dann würds gehn


----------



## Camino (26. Jun 2011)

bLaSt hat gesagt.:


> Klar die main-Methode gerhört eigentlich in die Klasse Text rein, dann würds gehn


Nein, das war eigentlich so schon richtig, wie es am Anfang war. Der Fehler lag am fehlenden bzw. falschen Konstruktor der Klasse Text und der Methode.


----------



## bLaSt (26. Jun 2011)

Camino hat gesagt.:


> Nein, das war eigentlich so schon richtig, wie es am Anfang war. Der Fehler lag am fehlenden bzw. falschen Konstruktor der Klasse Text und der Methode.



Ok^^
Wir haben aneinander vorbeigeredet. Ja das mit dem fehlenden Konstruktor hab ich ja au unter meinen Code geschrieben


----------



## thorstennn (26. Jun 2011)

Java-Fee hat gesagt.:


> @thorstenn: Aufgabenstellung lautet, aufbauend auf der main-Datei (aufgabe_8, siehe oben) eine Klasse "Text" sowie eine Klasse "SelectionSort" erstellen, die den in der Main-Methode angegebenen Text übernimmt, auswertet, sowie die Arrays (die man infolgedessen für die verschd. Wörter und deren Häufigkeiten angelegt hat) nach der Häufigkeit sortiert und die 10 häufigsten Wörter mitsamt deren Häufigkeit ausgibt.
> 
> Klingt einfach, ein Java-Programm, dass alles in einer Datei macht, hatte ich ja schon, aber ich komme mit dem übergeben von einer Klasse zur nächsten nicht klar.



ich muss die genau Aufgabenstellung kennen. 

Mit Selectionsort kann ja nur etwas sortiert werden, wenn es vorher in einzelne Elemente aufgeteilt wurde.

Also muss der Text erst in solche Elemente aufgeteilt werden.

Aber dein eigentliches Problem ist nicht das Splitten oder Zählen oder Sortieren, sondern eine statische Methode einer anderen Klasse aufzurufen?

Dann helfen keine Tipps, dann muss man Basics pauken. 

Nebensächliches: Muss der Text hard coded sein? Soll immer nur dieser eine Text untersucht werden? Nur die genaue Aufgabenstellung hilft weiter. 

Thorsten


----------



## Java-Fee (27. Jun 2011)

@alle, besonders gerlon und Java-Jan: danke, Programm läuft, sogar mit den 3 Klassen wie nach Aufgabenstellung.


----------



## thorstennn (27. Jun 2011)

Da du uns das nicht mitteilen möchtest, kann hier ja geschlossen werden.

Und die nächsten Hausaufgaben kannst du dann unter System.gc; - Hausaufgaben stellen.


----------



## Java-Fee (27. Jun 2011)

@thorstenn: Was meinst du denn mit nicht mitteilen? Wenn du auf die Uhrzeit des Posts geschaut hättest, da hatte ich keine Lust auf eine lange und breite Erklärung. Sobald feddich, werde ich den Thread schon als "erledigt" markieren... 

Das mit gc ignoriere ich einfach mal - wenn du mir nicht helfen willst, dann lass es halt.

...um es auf den Punkt zu bringen, "Programm läuft" war etwas vorschnell, die 3 Klassen lassen sich zwar fehlerfrei kompilieren, aber die Ausgabe haut noch nicht komplett hin... Ich werde schauen ob ich es allein hinbekomme (bevor wieder irgendwer mit "raten hilft nicht" kommt), sonst poste ich den Stand nochmal.


----------



## Java-Fee (27. Jun 2011)

...also mit der Ausführung und Darstellung gibt es eigentlich keine Fehler, aber da die sortierfunktion ausgelagert werden soll, konzentriere ich mich darauf.

Die Klasse der sortierfunktion lässt sich zwar kompilieren, bei ausführung des Programmes erhalte ich aber nur einen Wert (plus Wort) sowie die Gesamtwortzahl. Ich denke es liegt (wieder) an der Übergabe von Argumenten.

ausserdem beschränkt sich die Ausgabe nicht auf 10 elemente (obwohl ich das in der while-Schleife drin habe in der text-Klasse), weiss jemand woran das liegt...?

Hier die 3 Klassen:


```
public class Aufgabe_8 {

  public static void main(String [] arg) {

    String textString = "Herr Bundespräsident, Herr Ministerpräsident, Herr Landtagspräsident, Herr Kardinal, lieber Herr Zehetmair und lieber Freund Theo Waigel!"+
	                    "Während ich mir die Reden anhöre, gingen meine Gedanken in vergangene Zeiten zurück, und ich fragte mich: 'Wann warst du zum ersten Mal in München?'"+
                        "Wenn ich mich recht entsinne, war das Ende März 1945. Ich war damals gerade 15 Jahre alt und ich befand mich als Flaghelfer in Berchtesgaden."+
                        "Wir fuhren an einem Tag von Berchtesgaden nach München, um etwas dorthin zu transportieren. Ich kannte München noch nicht und meine erste Begegnung mit der Stadt war ein Schock,"+
                        "denn sie war ein einziger Trümmerhaufen. Angesichts dieses Elends sahen weder wir Kinder noch die Erwachsenen eine positive Zukunft. Doch wir haben es geschafft!"+
                        "Diese großartige Generation meiner Eltern, der Großeltern und vielleicht der Urgroßeltern verzweifelte trotz allem nicht.";

    Text txt = new Text( textString ); /** übergibt Text an Text-Methode */

    txt.printWordFreqStat(); /** gibt die geordnete Liste aus */

  }

}
```


```
import java.io.*;

class Text {


    private String textString;

    //Konstruktor
	public Text (String textString) {
    this.textString = textString;
	}

	//Methoden
	public void printWordFreqStat() {

		/** Variablen initialisieren */
		int textlength = 0;
		int ch;
		boolean last_was_char = false;
		String[] words;
		int index;
		String[] freq;
		int temp_zahl;
		int pos;

		/** in Kleinbuchstaben umwandeln */
		textString = textString.toLowerCase();

		/** Wortanzahl ermitteln */
		for (int i=0; i<textString.length(); i++) {
			/** Zeichen als ASCII-Code speichern */
			ch = (int)textString.charAt(i);

			//wenn Zeichen Buchstabe ist
			if ((ch > 96 && ch < 123)||ch == 223||ch == 228||ch == 246||ch == 252) {
				/** letztes Zeichen ist Buchstabe */
				last_was_char = true;
			}//if
			else if(last_was_char){
				/** letztes Zeichen kein Buchstabe */
				last_was_char = false;
				/** Wortende */
				textlength++;
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for


		/** Array aus Strings mit der Anzahl der Wörter erstellen */
		words = new String[textlength];

		/** Variablen initialisieren */
		words[0] = "";
		last_was_char = false;
		index = 0;

		/** Wörter einzeln in String-Array words ablegen */
		for (int i=0; i<textString.length(); i++) {
			ch = (int)textString.charAt(i);
			if ((ch > 96 && ch < 123)||ch==223||ch== 228||ch==246||ch == 252) {
				last_was_char = true;
				words[index] +=	textString.charAt(i);
			}//if
			else if(last_was_char){
				last_was_char = false;
				index++;
				if (index < textlength)
				words[index] = "";
			}//else if
			else {
				last_was_char = false;
			}//else
		}//for

		/** Array alphabetisch sortieren */
		java.util.Arrays.sort( words );

		/** Initialisieren der Variablen */
		freq = new String[textlength];
		temp_zahl = 1;
		pos = 0;

		String[] s = SelectionSort.Sort (words, freq, index, temp_zahl, pos);

		
		/** Array freq nach der Anzahl sortieren
		java.util.Arrays.sort( freq ); */

		/** Variablen initialisieren */
		int i=pos;


		while (true) {

			/** Array temp enthält das aktuelle Wort und die Häufigkeit */
			String temp[] = freq[i].split("_");

			/** falls weniger als 10 Wörter enthalten sind */
			if(i==0) {
				System.out.println(temp[1] + " " + temp[0] + " " +
					(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );
				break;
			}//if
			/** sonst die ersten Zehn ausgeben */
			else if ((i <= pos-9)) {
				String temp2[] = freq[pos-9].split("_");
				if (Integer.parseInt(temp[0]) < Integer.parseInt(temp2[0]) ) {
					break;
				}//if
			}//else if
			System.out.println(temp[1] + " " + temp[0] + " " +
				(float)((int)(Float.parseFloat(temp[0])*100/textlength*100))/100 +"%" );

			i--;
		}//while

		/** Ausgabe Anzahl Wörter */
		System.out.println("Wortzahl: "+textlength);

	} //main

} //class
```


```
class SelectionSort {

	public static String[] Sort (String[] words, String[] freq, int index, int temp_zahl, int pos) {

		/**
		 * Ermitteln der Worthäufigkeit
 		 * Fuer jedes Wort wird die Anzahl angegeben
 		 * In Array freq eingetragen als: "ANZAHL"_"WORT"
		 */
		for (int i=0; i<index; i++) {
			freq[i] = "_";
			if (words[i].equals(freq[pos])) {
				temp_zahl++;
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//if
			else {
				if (i > 0) {
					freq[pos] = temp_zahl + "_" +freq[pos];
					pos++;
					temp_zahl = 1;
				}//if
				freq[pos] = words[i];
				if (i==index-1) {
					freq[pos] = temp_zahl + "_" +freq[pos];
				}//if
			}//else
		}//for

		/** Array freq nach der Anzahl sortieren */
		java.util.Arrays.sort( freq );

        return freq;
	}
}
```


----------



## Java-Fee (27. Jun 2011)

...komm leider nicht weiter, jemand eine Idee. wo der Fehler liegt?


----------



## Marcinek (27. Jun 2011)

Ich würde ein paar Debugausgaben oder debugen um den Fehler zu finden.

Ich finde, dass das extrem umständlich programmiert ist. Der Grund wird wohl eine mangelnde Planung des ganzen mit Stift und papier sein ;D

Das wurde auch in dem anderen Thread angeregt und ich finde es gut.

Wieso setzt ihr euch nicht zusammen? - Ich hatte schon mehrfach angeboten dabei zu sein um zu helfen. 

Gruß Martin

P.S. Thorstenn ist ein gemeiner Forentrolll . Einfach ignorieren.


----------



## Java-Jan (27. Jun 2011)

Klasse Text: 
In Zeile 83 setzt du pos auf 0. In Zeile 92 steht i = pos, also ist dann auch i == 0. Somit ist die Bedingung in Zeile 101 erfüllt, du machst eine Ausgabe und verlässt die Schleife durch break.


----------



## einfacher (27. Jun 2011)

Ich meine dir fehlt eine Festlegung der ArrayGröße,oder?


----------



## thorstennn (27. Jun 2011)

Marcinek hat gesagt.:


> Ich finde, dass das extrem umständlich programmiert ist. Der Grund wird wohl eine mangelnde Planung des ganzen mit Stift und papier sein ;D
> 
> Das wurde auch in dem anderen Thread angeregt und ich finde es gut.
> 
> ...



Das hat nix mit Troll zu tun, wenn ich gerne die ganze Aufgabenstellung hätte, sofern es die überhaupt gibt. Und für weiter Fragen ist es jawohl sinnvoll, in der richtigen Kategorie zu posten. 

Anstatt alles in die main zu klatschen, gibt es jetzt ein Attribut textString und eine Intanzmethode printWordFreqStat, in der alles abläuft. Das ist vom Design her auch nicht viel besser.

Und damit man da Tipps geben kann, muss man die genau aufgabenstellung kennen. Manoman


----------



## Java-Fee (27. Jun 2011)

...um es mal in einem Post zu formulieren, ja, ich weiss, das die Programmierung nicht perfekt ist, auch weit umständlicher als ich es vorhatte, aufgrund mangelnder Zeit (das ist auch der Grund, warum ich mich nicht mit anderen zusammensetzen konnte) musste ich in Teilen auf ein vorgefertigtes Programm zurückgreifen, das mir aus der Vergangenheit zur verfügung stand.

Wie kann ich denn zumindest das mit der Schleife lösen? Reicht das, wenn ich die Schleifenbedingung umdrehe? Also den else if Teil voranstelle?


----------



## Marcinek (28. Jun 2011)

Java programmieren hat nix mit raten zu tun. (Höchstens "geschicktes" raten) ^^


```
import java.util.ArrayList;
import java.util.Collections;


public class Text {

	private String text= null;
	
	public Text(String pText) {
		this.text = pText;
	}

	public void printWordFreqStat() {
		// 1. Splitten
		String[] lTextSplit = this.text.split(" ");
		
		// 2. Zählarray aufmachen.
		ArrayList<Word> lWordListe = new ArrayList<Text.Word>();
		
		// 3. Zählen
		for(String lWord : lTextSplit) {
			this.handleWord(lWord, lWordListe);
		}
		
		// 4. Sortieren.
		Collections.sort(lWordListe);
		
		// 5. Ausgabe
		
		for(int i = 0; i < 10 && lWordListe.size() - i - 1> 0; i++) {
			Word lWord = lWordListe.get(lWordListe.size() - i - 1);
			System.out.println(lWord);
		}
	}
	
	private void handleWord(String pWord, ArrayList<Word> pWordListe) {
		boolean lWordExists = false;
		
		for(Word lWord : pWordListe) {
			if(lWord.getWord().equals(pWord)) {
				lWord.incFreq();
				lWordExists = true;
				break;
			}
		}
		
		if(!lWordExists) {
			pWordListe.add(new Word(pWord));
		}
	}

	private class Word implements Comparable<Word>  {
		private int freq = 1;
		private String word;
		
		public Word (String pWord) {
			this.word = pWord;
		}
		
		
		public void incFreq() {
			this.freq++;
		}
		
		public int getFreq() {
			return this.freq;
		}
		
		public void setWord(String word) {
			this.word = word;
		}

		public String getWord() {
			return word;
		}

		public int compareTo(Word arg0) {
			if(arg0 == null) {
				throw new NullPointerException("arg0 should not be null here..");
			}
			return this.freq - arg0.getFreq();
		}
		
		public String toString () {
			return this.word + " => " + String.valueOf(this.freq);
		}
		
	}
}
```

Sorry, aber ich kann mir das Dilema hier in dem Beitrag nicht weiter antun und möchte das hiermit beenden ^^


----------



## Firephoenix (28. Jun 2011)

Hi,
wenn man nur an den Leerstellen splittet sollte man aber die Aufgabenstellung nochmal prüfen.
Satzzeichen sind an sich nämlich keine Wörter, außer es ist vorgegeben, dass z.B. "Wort" ein anderes Wort ist als "Wort." und das wieder ein anderes ist als "Wort," 
Gruß


----------



## Marcinek (28. Jun 2011)

Ja da hast du recht. - Aber die Änderung ist sehr trivial 

Fraglich ist auch, ob die genutzten API Funktionen auch verwendet werden dürfen oder nicht.


----------



## thorstennn (28. Jun 2011)

Evtl. kann man modifiziertes trim auf das Ergebnis von split anwenden, das dann die Satzzeichen entfernt, gefolgt von einem toLowerCase?


----------



## Marcinek (28. Jun 2011)

Ich belasse das dem TO. Obwohl ich nicht davon ausgehe, dass er das schafft.


----------



## thorstennn (28. Jun 2011)

Du räumst den Optimismus ja auch keine Platz ein hehe


----------



## Prinzessin (26. Nov 2011)

...einfach mal die Fr.... halten, würd ich den letzten beiden Usern empfehlen. Nur du..e Antworten, anstatt zu helfen, wenn es offensichtlich ist das der Threadersteller fragt weil er nicht mehr durchsieht und/oder weiter weiss. Wozu gibt es denn diese Rubriken?

Hilfe ergibt sich nicht daraus, dass man jemandem sagt, was er nicht kann (was er im vorliegenden fall ja schon kundgetan hat), sondern dass man ihm Tips zur Bewältigung der Probleme gibt oder ansätze oder in einem Anfall selbloser Nächstenliebe (und weil es für denjenigen kein problem dastellt), die Lösung aufzuzeigen. Irgendwelche pseudo-kryptischen Hinweise auf den Java-Wissensstand des Fragenden helfen weder ihm noch sonstwem. Wenn ihr was zur belustigung sucht, da gibt es eigenständige Webseiten für... ;-)


----------



## Marcinek (26. Nov 2011)

Welchen Sinn macht es einen Uralten perfekt gelösten Thread hervorzukramen als "Gast" um sich dann noch über die Helfer zu beschweren?:noe:

Please close!


----------

