Hilfe beim Umschreiben von Javascript nach Java

ok, ich habe jetzt noch eine Printausgabe hinzufügt, dass der Code wie folgt aussschaut:
Java:
import java.util.TreeMap;
 
public class Zahl2 {
 
    public static void main(final String[] args) {
        String textString = "Hallo hallo Hallohallo. HALLO, übel aber 2 2Wenn";
        // hier drin wird gespeichert, wie oft das Wort jeweils vorkommt
        final TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();
 
        // "löscht" alle Punkte und Kommata
        textString = textString.replaceAll("[\\p{Punct}]+", "");
 
        // vielleicht auch noch sinnvoll: Groß- und Kleinschreibung ignorieren
        textString = textString.toLowerCase();
 
        // Text an jedem Leerzeichen aufsplitten
        final String[] words = textString.split(" ");
 
        for (final String str : words) {
            if (wordsCounter.containsKey(str)) {
                wordsCounter.put(str, wordsCounter.get(str) + 1);
            } else {
                wordsCounter.put(str, 1);
            }
        }
		System.out.println(wordsCounter);
    }
	
}

Er zählt jetzt aber noch Zahlen. Ich dachte, das könnte man eventuell mit \\1\\2 wegbekommen, aber das will so nicht. In der Ausgabe fängt er mit { an und endet mit }, wie kriegt man das weg?
 
Zuletzt bearbeitet von einem Moderator:
So sollte es funktionieren (tut es bei mir wenigstens):
Java:
import java.util.TreeMap;

public class Zahl2 {

	public static void main(final String[] args) {
		String textString = "Hallo hallo Hallohallo. HALLO, übel aber 2 2Wenn";
		// hier drin wird gespeichert, wie oft das Wort jeweils vorkommt
		final TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();

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

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

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

		for (final String str : words) {
			if (wordsCounter.containsKey(str)) {
				wordsCounter.put(str, wordsCounter.get(str) + 1);
			} else {
				wordsCounter.put(str, 1);
			}
		}
		System.out.println(wordsCounter);

		// 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;
	}
}

EDIT: Beantwortet die geschachtelte for-Schleife deine Frage?
 
Zuletzt bearbeitet:
Ja, grandios, bin da gestern noch am verzweifeln gewesen, weil ich das versucht habe ähnlich zu lösen, aber ich immer fehler drin gehabt habe.

Leider hab ich noch Probleme mit folgendes Algorithmus
Java:
textString = textString.replaceAll("[\\p{Punct}]+", "");

Dieser berücksichtigt keine Mehrfachlehrzeichen. Ich habe schon mit \\s \\s+ herumprobiert, aber dann lässt der auf einmal Punkt und Komma an den Worten ect.
Außerdem werden Umlaute nicht richtig in der Konsole dargestellt, aber das müsste doch ein Problem der Konsole sein und nicht von Java, richtig?
 
Zuletzt bearbeitet von einem Moderator:
Wegen der Kodierung: Ja, du benutzt wahrscheinlich Windows oder? Probier mal die PowerShell, vielleicht kann die es besser

wegen den Leerzeichen: probier mal (zusätzlich) diese Zeile:
Java:
// erstes Argument: 2 Leerzeichen, zweites Argument: 1 Leerzeichen
textString = textString.replaceAll("  ", " ");
 
Das funktioniert zwar für 2 Leerzeichen, aber bei mehr zählt der wieder falsch. Irgendeiner noch Vorschläge?
 
Wenn ich jetzt 3 Klassen erzeugen will, mit dem Namen Main.java, Text.java und SelectSort.java, wie stell ich das an?

In C++ hätte ich die main z.B. wie folgt geschrieben:
Code:
#include <java>
#include <selectsort>

Ich hab schon gelesen, dass das nicht gehen soll. Ich habe die main der Java Datei wie folgt gegeben:
Java:
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);
  txt.printWordFreqStat();
  }
}

So wie ich das verstanden habe, funktioniert die Idee mit dem Prinzip der Vererbung, jedoch weiß ich da nicht wo hintern und vorne ist.
 
Zuletzt bearbeitet von einem Moderator:
Ich hab noch ne Idee für das Leerzeichen-Problem:
Bei String.split(" "); haben mehrere aufeinanderfolgende Leerzeichen doch nur das Problem, dass im resultierenden Array einige Einträge den Wert "null" haben. Das ließe sich doch ganz einfach mit einer if-Abfrage beheben, nach dem Schema:
(Zum Einfügen in meinen Code, Post 25.06.11, 20:10, Zeile 19)
Java:
if(str == null){
      continue;
}
 
Zu den Klassen:
Benutzt du eine IDE zum programmieren? Wenn nein, würde ich dir Eclipse ( http://eclipse.org/downloads/packages/eclipse-ide-java-developers/indigor ) oder Netbeans ( http://netbeans.org/ ) empfehlen.

Die Text.java würde ich so schreiben:
Java:
public class Text{
      private String text;
      public Text(String text){
           this.text = text;
      }

      public void printWordFreqStat(){
      final TreeMap<String, Integer> wordsCounter = new TreeMap<String, Integer>();
 
        // "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);
            }
        }
        // System.out.println(wordsCounter);
 
        // 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;
    }
}
Das sollte dann mit deiner Main so funktionieren. Die beiden compilierten .class-Files müssen dann im gleichen Ordner liegen, dann sollte es funktionieren. Oder du nutzt eine IDE und exportierst das ganze als "Runnable JAR File".

Was meinst du mit SelectSort.java ? was soll diese Klasse tun?
 
@pap
Man sieht ... du hast wenig Erfahrung mit Java. Warum fragst du nicht einfach deinen Lehrer ob er dir dabei helfen kann. Er weis am besten was du kannst und was nicht ... und er kann es dir denke ich mal auch etwas besser erklären als wir da wir hier meistens davon ausgehen das zumindest Grundlagen vorhanden sind die bei dir größtenteils einfach fehlen *z.B. arbeiten mit mehreren Klassen*.
Auch verstehe ich dein Probolem mit den "mehreren" Leerziechen nicht. Wenn man das String.replaceAll() nimmt was ich gepostet habe werden alle Punktierungen nicht in LEERZEICHEN umgewandelt sondern komplett rausgenommen. Folglich solltest du einen resultierenen Text haben der lediglich die Wörter und dazwischen je EIN Leerzeichen enthält. Ansonsten hast du irgendwo einen Fehler drin.
Und wie hier bereits erwähnt wurde : das ganze mit einem statischen Text als Consolen-App zu bauen ist eigentlich schwachsinn ... wenn dann sollte es schon mit einer GUI sein wo man 1) Text eingeben kann und 2) sich keine Sorgen um die Formatierung auf der Console zu machen *auch nicht um Sonderzeichen / Umlaute*, aber dafür fehlt dir wiederum das Grundwissen für GUI's.

Meine persönlich Meinung : von JavaScript nach Java portieren sollte man nur machen wenn man aus beiden Sprachen so viel weis wie dafür nötig ist was bei dir hier ganz offensichtlich NICHT der Fall ist.
Hast du dich während des Zeitraums den du dich jetzt schon mit Java beschäftigst schon mal aus eigeninitiative mit entsprechenden Fach-Büchern beschäftigt ? *JavaInsel ist zum Beispiel eines der besten.* Das sieht mir nämlich nicht so aus. Ich persönlich lese aus deinen Posts nur raus das du irgendwie notgedrungen die Aufgaben im Unterricht bewältigst und es dabei belässt und jetzt Probleme bei einer Klausur bekommst weil du dich scheinbar nicht selbst um weiteres Wissen bemüht hast. Auch hätte man vorher Infos einholen können mit welchen Sprachen gearbeitet wird. Da du ja Erfahrung in JavaScript und scheinbar C hast warum hast du dir dann keine Kurs gesucht in denen eine dieser Sprachen behandelt wird ? Bist du davon ausgegangen : ach wird schon ... nee ... so funktioniert das nicht. Ein bisschen eigeninitiative wäre im VORFELD nicht schlecht gewesen anstatt jetzt 5 Minuten vor der Angst alles nachholen zu wollen.
Dazu kommt das du fälschlicher Weise immer noch in JavaScript denkst und nicht in Java. Wie ich schon mal sagte : gewöhne dir das ab da du sonst bei vielen Java-Eigenheiten nicht mehr klarkommst da es diese so in Scriptsprachen wie eben JavaScript NICHT gibt. *Ganz großes Thema wären z.B. Threads.*
Es wäre für mich kein Problem mich jetzt hinzusetzen und in ein paar Stunden dir eine komplett funktionierende Applikation mit GUI zu basteln ... das ganze auch noch zu kommentieren und dann versucht genervt dir zu erklären wie das ganze funktioniert. Das bringt aber nichts wenn wir dir hier Codes zuwerfen noch und nöcher und du diese einfach nicht verstehst weil dir die wichtigsten Grundlagen fehlen. Das Thema hier wird MIR persönlich zu stumpf da von diener Seite aus scheinbar nichts entgegen kommt. Du hast deinen Code in JS und von uns mitlerweile genug Hilfe und Codes bekommen um dein Script portieren zu können ... wenn du jetzt noch einen brauchst der dir das abnimmt tust du mir jetzt schon vor deiner Klausur leid die du mit aller wahrscheinlichkeit nicht packen wirst.
 
Zurück