Hilfe beim Umschreiben von Javascript nach Java

Die Klasse SelectSort soll den zur Haeufigkeitsfeststellung benötigten Sortieralgoritmus enthalten. Ich danke dir schonmal sehr. Ich versuche wirklich alles hier geschriebe zu verarbeiten und zu verstehen. Ich habe mich heute schon den ganzen Tag ohne Internet daran versucht, leider mit wenig Erfolg.
 
achja, erstmal: Ich schreibe meinen Code nur mit Notepad++ und benutze darüber hinaus die Konsole. Ich werde mir auf jeden Fall die von dir geposteten Programme anschauen.
Wie genau kann ich weitere Klassen einbinden oder wo kann ich das nachlesen?
 
Ich schaffe quf eine Klasse SelectSort in SelectSort.java zuzugreifen, aber der schafft es nicht die Daten wie gewollt zu kompilieren. Ach man.
 
Zu den weiteren Klassen: Hat genodeftest das nicht schon beschrieben?
Solange du keinen namespace/package angibst, müssen die class-Dateien nur im gleichen Ordner sein.

Bitte vermeide in Zukunft Dreifachposts. Vor allem, wenn sie nur eine Zeile lang sind
Und was bedeutet dien letzter Post?
 
Das Problem ist, dass aus der Klasse Text noch der Sortieralgoritmus ausgelagert werden soll. Dieser soll ja in SelectSort.java stehen und von der Text.java sozusagen drauf zugegriffen werden.
Ich habe wirklich alles mögliche versucht diese zu machen, aber es kommt immer wieder zu verschiedensten Fehlermeldungen.
Kann mir jemand vielleicht diesen Code auslagern, damit ich das an dem Code nachvollziehen kann, weil ich eigentlich meine, den Rest anhand der Codebeispiele schon gut verstanden zu haben, weswegen es mich auch fruststriert, dass das mit dem weiteren Auslagern einfach nicht klappen will.

Ich werden in Zukunft alles in einen Post packen.
 
Es ist im Endeffekt möglich das zu trennen, aber ich überlege mir schon die ganze Zeit, WIESO****? Ist doch völlig unnötig das herauszutrennen. 3 Klassen daraus zu machen ist vollkommen unnötig, weil die Klasse Text so gut wie NUR aus dem Sortieralgorithmus besteht. Dadurch bekommst du 3 Klassen, wovon zwei Klassen nur eine Methode enthalten: Eine kleine und eine etwas größere Methode. So etwas ist unnötig!
 
Ich weiß, dass das unnötig ist. Zu nichts real nütze ist auch mit einem statischen Text zu arbeiten, wobei sich die TreeMap ja zumindestens schon anpassen würde, falls so ein dynamischer Input eingebaut werden würde. Ich soll anhand der Aufgabe trotzdem rausfinden, wie das mit dem weiteren Auslagern des Sortierverfahren geht. Daran scheiter ich bis jetzt kläglich. Ich versuch mich in Java einzudenken, werde mir jetzt auch SPIKEe`s Ratschlag mit dem Java Tutorial näher zu Herzen führen, aber es wäre zu diesem Zeitpunkt trotzdem topGun, wenn du mir zeigen könnte, wie das an dem Beispiel geht, damit ich die richtige Lösung zu der Aufgabenstellung habe und anhand dessen dann versuchen zu verstehen, wie ich das in Zukunft machen kann?
 
Es gibt vielleicht andere Lösungswege, die möglicherweise besser sind, aber ich habe das mal so gemacht:

Java:
import java.util.TreeMap;

public class SelectedSorted {

	TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();

	public SelectedSorted(TreeMap<String, Integer> wordsCounter) {
		this.wordsCounter = wordsCounter;
	}

	public void selectedSorted() {
		// die häufigsten 10 Wörter herausfinden:
		final String[] mostCommonWords = new String[10];
		final int[] numberOfOccurences = new int[10];

		for (int i = 0; i < mostCommonWords.length; i++) {
			/*
			 * diese beiden Variablen bilden nach durchlauf der nächsten
			 * for-Schleife ein Wertepaar, das den nächsten Platz an der TOP10
			 * belegt, indem sie immer mit dem höchsten Wert gefüllt werden.
			 */
			int bisherigesMaximum = 0;
			String wortMitMaximum = null;
			for (final String str : wordsCounter.keySet()) {
				if (wordsCounter.get(str) > bisherigesMaximum) {
					// testen, ob dieses Wort schon berücksichtigt wurde
					if (!arrayContainsString(str, mostCommonWords)) {
						bisherigesMaximum = wordsCounter.get(str);
						wortMitMaximum = str;
					}
				}
			}
			mostCommonWords[i] = wortMitMaximum;
			numberOfOccurences[i] = bisherigesMaximum;
		}

		// Die Ausgabe des Ergebnisses
		System.out.println("Die 10 häufigsten Wörter im Text sind:");
		for (int i = 0; i < mostCommonWords.length; i++) {
			System.out.println(mostCommonWords[i] + " ("
					+ numberOfOccurences[i] + " mal)");
		}
	}

	/**
	 * Testet, ob der String toTest im Array array vorkommt.
	 * 
	 * @return true, wenn der String toTest in array enthalten ist, ansonsten
	 *         false
	 */
	private static boolean arrayContainsString(final String toTest,
			final String[] array) {
		for (final String str : array) {
			if (str != null && str.equals(toTest)) {
				return true;
			}
		}
		return false;
	}
}

Java:
public class Main {

	public static void main(String[] arg) {
		String textString = "Herr Bundespraesident, Herr Ministerpraesident, Herr Landtagspraesident, Herr Kardinal, lieber Herr Zehetmair und lieber Freund Theo Waigel! Waehrend ich mir die Reden anhoere, gingen meine Gedanken in vergangene Zeiten zurueck, und ich fragte mich: 'Wann warst du zum ersten Mal in Muenchen?' Wenn ich mich recht entsinne, war das Ende Maerz 1945. Ich war damals gerade 15 Jahre alt und ich befand mich als Flughelfer in Berchtesgaden. Wir fuhren an einem Tag von Berchtesgaden nach Muenchen, um etwas dorthin zu transportieren. Ich kannte Muenchen noch nicht und meine erste Begegnung mit der Stadt war ein Schock, denn sie war ein einziger Truemmerhaufen. 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);
		txt.printWordFreqStat();
	}
}

Java:
import java.util.TreeMap;

public class Text {

	private String text;
	final TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();
	SelectedSorted ssd = new SelectedSorted(wordsCounter);

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

	public void printWordFreqStat() {

		// "löscht" alle Punkte und Kommata
		text = text.replaceAll("[\\p{Punct}]+", "");

		// vielleicht auch noch sinnvoll: Groß- und Kleinschreibung ignorieren
		text = text.toLowerCase();

		// Text an jedem Leerzeichen aufsplitten
		final String[] words = text.split(" ");

		for (final String str : words) {
			if (str == null)
				continue;
			if (wordsCounter.containsKey(str)) {
				wordsCounter.put(str, wordsCounter.get(str) + 1);
			} else {
				wordsCounter.put(str, 1);
			}
		}
		ssd.selectedSorted();
	}
}

Ob das nun eine elegante Lösung ist, kann ich dir nicht sagen. Ich bin noch nicht so erfahren, wie die meisten hier, aber diese Lösung splittet die Text.java nochmal auf. Und es funktioniert!

BTW: Wenn du Java richtig lernen willst, empfehle ich dir diesen javavideokurs: http://www.javavideokurs.de. Für wenig Geld kriegt man Java gut erklärt. Auch für Anfänger. Ist zwar noch nicht komplett, aber es wird immer weitergeführt und da wartet man ja gerne :) Kannst es dir mal anschauen =)
 
Klick Klick. Einen Sprung weiter. Ich seh jetzt auf jeden Fall klarer. Das einzige Problem ist, dass die Printanweisung in Text.java sein soll, also theoretisch zurückgesprungen werden soll. Wenn man die ganze Printanweiung rausnimmt, lässt sich SelectedSorted natürlich problemlos kompilieren, die Frage ist, wie gesagt nur, ob man die Printanweisung in Text.java packen kann und jetzt so einfach wieder von SelectedSorted zurücklinken kann?
 
Ist möglich. Ich finde so etwas sehr unnötig und deshalb habe ich hier nicht speziell mit Vererbung gearbeitet, weil es ein hin und her wäre, welches in einer Vererbung nicht vorgesehen ist!

Im Grunde ist es möglich. Hier der geänderte Code:
Java:
import java.util.TreeMap;

public class SelectedSorted {

	TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();
	final String[] mostCommonWords = new String[10];
	final int[] numberOfOccurences = new int[10];

	public SelectedSorted(TreeMap<String, Integer> wordsCounter) {
		this.wordsCounter = wordsCounter;
	}

	public void selectedSorted() {
		// die häufigsten 10 Wörter herausfinden:

		for (int i = 0; i < mostCommonWords.length; i++) {
			/*
			 * diese beiden Variablen bilden nach durchlauf der nächsten
			 * for-Schleife ein Wertepaar, das den nächsten Platz an der TOP10
			 * belegt, indem sie immer mit dem höchsten Wert gefüllt werden.
			 */
			int bisherigesMaximum = 0;
			String wortMitMaximum = null;
			for (final String str : wordsCounter.keySet()) {
				if (wordsCounter.get(str) > bisherigesMaximum) {
					// testen, ob dieses Wort schon berücksichtigt wurde
					if (!arrayContainsString(str, mostCommonWords)) {
						bisherigesMaximum = wordsCounter.get(str);
						wortMitMaximum = str;
					}
				}
			}
			mostCommonWords[i] = wortMitMaximum;
			numberOfOccurences[i] = bisherigesMaximum;
		}
	}

	/**
	 * Testet, ob der String toTest im Array array vorkommt.
	 * 
	 * @return true, wenn der String toTest in array enthalten ist, ansonsten
	 *         false
	 */
	private static boolean arrayContainsString(final String toTest,
			final String[] array) {
		for (final String str : array) {
			if (str != null && str.equals(toTest)) {
				return true;
			}
		}
		return false;
	}
}

Java:
import java.util.TreeMap;

public class Text {

	private String text;
	final TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();
	SelectedSorted ssd = new SelectedSorted(wordsCounter);

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

	public void printWordFreqStat() {

		// "löscht" alle Punkte und Kommata
		text = text.replaceAll("[\\p{Punct}]+", "");

		// vielleicht auch noch sinnvoll: Groß- und Kleinschreibung ignorieren
		text = text.toLowerCase();

		// Text an jedem Leerzeichen aufsplitten
		final String[] words = text.split(" ");

		for (final String str : words) {
			if (str == null)
				continue;
			if (wordsCounter.containsKey(str)) {
				wordsCounter.put(str, wordsCounter.get(str) + 1);
			} else {
				wordsCounter.put(str, 1);
			}
		}
		ssd.selectedSorted();

		// Die Ausgabe des Ergebnisses
		System.out.println("Die 10 häufigsten Wörter im Text sind:");
		for (int i = 0; i < ssd.mostCommonWords.length; i++) {
			System.out.println(ssd.mostCommonWords[i] + " ("
					+ ssd.numberOfOccurences[i] + " mal)");
		}
	}
}

Das einzigste, was geändert werden musste, die Methode rüberschieben, die lokalen Variablen zu Instanzvariablen machen (aus dem Methodenrumpf ziehen), damit sie von anderen Klassen gelesen werden können und nicht nach Beendigung der Methode gelöscht werden, sondern nach Beendigung des Programms und vor den Variablen in der Ausgabe einfach das ssd davorhängen, damit es die Variablen der anderen Klasse zuordnen kann. Im Grund alles ganz einfach. Man könnte jetzt auch noch hergehen und Vererbung mit ins Spiel bringen, dann müsstest du dich aber mit der Vererbung auskennen und so ist es einfacher :)
 

Neue Beiträge

Zurück