Teilstring durch Teilstring mittels StringBuilder ersetzen

werdas34

Bekanntes Mitglied
Hallo,

ich habe die folgende Aufgabe erhalten:
Bei einer Rede (Stoibers Transrapid) sollen alle '.' durch '...aeh...' ersetzt werden.
Hätte eine for Schleife gemacht, die entsprechend das tun soll. Nur erhalte ich eine StringIndexOutOfBoundsException.
Hier mal die Schleife:
Java:
for(int i = 0; i < stoiber.length() + aehLength; i++) { //aehLength enthält die Länge ...aeh...
            if(stoiber.charAt(i) == POINT) {
                stoiber.replace(i, i+1, aeh);       
                i += aehLength;
            }
}
Kurze Erklärung was ich mir dabei gedacht habe.
Trifft die Schleife auf einen Punkt soll sie den Punkt entfernen, dann das ...aeh... hinzufügen und damit sie nicht dauerhaft diese Punkte von ...aeh... in neue ...aeh...'s umwandelt wird i nach dem letztem Punkt um die Länge aeh addiert, damit man dies vermeidet.
Funktioniert auch super (zumindest im Debugger), aber er gibt mir am Ende dann die Exception aus.
Ich vermute das liegt daran, dass durch das i+1 in der letzen Iteration kein weiteres Zeichen gefunden wird, da der Text zu Ende ist.
Nur wie behebe ich das ?

Noch ne kleine Frage am Rande.
Haben vom Prof eine .class Datei bekommen. Wir mussten eine Klasse programmieren und dann diese mit der .class Datei testen. Wenn keine Fehlermeldung kommt, haben wir keine Fehler. Wenn ich das jetzt mache kommt:
Fehler: Hauptklasse Test.class konnte nicht gefunden oder geladen werden.
Liegt der Fehler an meinem Code, oder an der Test.class Datei, dessen Code ich nicht sehe. Denn ich kann ja keine Hauptklasse jetzt hinzufügen oder sonstiges, da ich den Code nicht habe, nur den Bytecode.
 
Hallo,

ich habe die folgende Aufgabe erhalten:
Bei einer Rede (Stoibers Transrapid) sollen alle '.' durch '...aeh...' ersetzt werden.
Hätte eine for Schleife gemacht, die entsprechend das tun soll. Nur erhalte ich eine StringIndexOutOfBoundsException.
Hier mal die Schleife:
Java:
for(int i = 0; i < stoiber.length() + aehLength; i++) { //aehLength enthält die Länge ...aeh...
            if(stoiber.charAt(i) == POINT) {
                stoiber.replace(i, i+1, aeh);      
                i += aehLength;
            }
}
Kurze Erklärung was ich mir dabei gedacht habe.
Trifft die Schleife auf einen Punkt soll sie den Punkt entfernen, dann das ...aeh... hinzufügen und damit sie nicht dauerhaft diese Punkte von ...aeh... in neue ...aeh...'s umwandelt wird i nach dem letztem Punkt um die Länge aeh addiert, damit man dies vermeidet.
Funktioniert auch super (zumindest im Debugger), aber er gibt mir am Ende dann die Exception aus.
Ich vermute das liegt daran, dass durch das i+1 in der letzen Iteration kein weiteres Zeichen gefunden wird, da der Text zu Ende ist.
Nur wie behebe ich das ?

Du prüfst aktuell ob i, also die Position des chars, den du prüfst, kleiner ist, als die Länge des Strings plus die Länge des ähs.
Klingt das passend? 😉


Noch ne kleine Frage am Rande.
Haben vom Prof eine .class Datei bekommen. Wir mussten eine Klasse programmieren und dann diese mit der .class Datei testen. Wenn keine Fehlermeldung kommt, haben wir keine Fehler. Wenn ich das jetzt mache kommt:
Fehler: Hauptklasse Test.class konnte nicht gefunden oder geladen werden.
Liegt der Fehler an meinem Code, oder an der Test.class Datei, dessen Code ich nicht sehe. Denn ich kann ja keine Hauptklasse jetzt hinzufügen oder sonstiges, da ich den Code nicht habe, nur den Bytecode.
Wie startest du denn? .class musst du beim Starten nicht mit angeben
 
Du prüfst aktuell ob i, also die Position des chars, den du prüfst, kleiner ist, als die Länge des Strings plus die Länge des ähs.
Klingt das passend? 😉
Jetzt, wo du das so formulierst, wird mir selbst erst klar wie dumm es eigentlich ist. Da ich davor noch nie mit StringBuilder gearbeitet habe, wusste ich nicht wie schnell der String aktualisiert wird. Danke. Jetzt funktioniert es.

Wie startest du denn? .class musst du beim Starten nicht mit angeben
Ach, ein dummer Fehler von mir. Danke. Funktioniert. Es ist immer das selbe, da man dann mit den Pfeiltasten die Datei sucht, aber das .class nicht löscht.
 
Meinst wohl sowas:
Java:
// main...
    public static void main(String[] args) {
        String string2 = "";
        String string
                = "Eine wunderbare Heiterkeit hat meine ganze Seele eingenommen, gleich den süßen Frühlingsmorgen, die ich mit ganzem Herzen genieße. Ich bin allein und freue mich meines Lebens in dieser Gegend, die für solche Seelen geschaffen ist wie die meine. Ich bin so glücklich, mein Bester, so ganz in dem Gefühle von ruhigem Dasein versunken, daß meine Kunst darunter leidet. Ich könnte jetzt nicht zeichnen, nicht einen Strich, und bin nie ein größerer Maler gewesen als in diesen Augenblicken. Wenn das liebe Tal um mich dampft, und die hohe Sonne an der Oberfläche der undurchdringlichen Finsternis meines Waldes ruht, und nur einzelne Strahlen sich in das innere Heiligtum stehlen, ich dann im hohen Grase am fallenden Bache liege, und näher an der Erde tausend mannigfaltige Gräschen mir merkwürdig werden; wenn ich das Wimmeln der kleinen Welt zwischen Halmen, die unzähligen, unergründlichen Gestalten der Würmchen, der Mückchen näher an meinem Herzen fühle, und fühle die Gegenwart des Allmächtigen, der uns nach seinem Bilde schuf, das Wehen des Alliebenden, der uns in ewiger Wonne schwebend trägt und erhält; mein Freund! Wenn's dann um meine Augen dämmert, und die Welt um mich her und der Himmel ganz in meiner Seele ruhn wie die Gestalt einer ";
        String matchNot = "äöüß";
        matchNot += matchNot.toUpperCase();
        matchNot += "\\w\\s";
        Matcher matcher = Pattern.compile("([" + matchNot + "]*)([^" + matchNot + "])").matcher(string);
        while (matcher.find()) {
            string2 += matcher.group(1) + "...aeh..." + "\n";
        }
        System.out.println(string2);
    }

Ausgabetext
Code:
Eine wunderbare Heiterkeit hat meine ganze Seele eingenommen...aeh...
 gleich den süßen Frühlingsmorgen...aeh...
 die ich mit ganzem Herzen genieße...aeh...
 Ich bin allein und freue mich meines Lebens in dieser Gegend...aeh...
 die für solche Seelen geschaffen ist wie die meine...aeh...
 Ich bin so glücklich...aeh...
 mein Bester...aeh...
 so ganz in dem Gefühle von ruhigem Dasein versunken...aeh...
 daß meine Kunst darunter leidet...aeh...
 Ich könnte jetzt nicht zeichnen...aeh...
 nicht einen Strich...aeh...
 und bin nie ein größerer Maler gewesen als in diesen Augenblicken...aeh...
 Wenn das liebe Tal um mich dampft...aeh...
 und die hohe Sonne an der Oberfläche der undurchdringlichen Finsternis meines Waldes ruht...aeh...
 und nur einzelne Strahlen sich in das innere Heiligtum stehlen...aeh...
 ich dann im hohen Grase am fallenden Bache liege...aeh...
 und näher an der Erde tausend mannigfaltige Gräschen mir merkwürdig werden...aeh...
 wenn ich das Wimmeln der kleinen Welt zwischen Halmen...aeh...
 die unzähligen...aeh...
 unergründlichen Gestalten der Würmchen...aeh...
 der Mückchen näher an meinem Herzen fühle...aeh...
 und fühle die Gegenwart des Allmächtigen...aeh...
 der uns nach seinem Bilde schuf...aeh...
 das Wehen des Alliebenden...aeh...
 der uns in ewiger Wonne schwebend trägt und erhält...aeh...
 mein Freund...aeh...
 Wenn...aeh...
s dann um meine Augen dämmert...aeh...

?

Anstatt string2 jetzt einfach StringBuilder.
 
Meinst wohl sowas:
Java:
// main...
    public static void main(String[] args) {
        String string2 = "";
        String string
                = "Eine wunderbare Heiterkeit hat meine ganze Seele eingenommen, gleich den süßen Frühlingsmorgen, die ich mit ganzem Herzen genieße. Ich bin allein und freue mich meines Lebens in dieser Gegend, die für solche Seelen geschaffen ist wie die meine. Ich bin so glücklich, mein Bester, so ganz in dem Gefühle von ruhigem Dasein versunken, daß meine Kunst darunter leidet. Ich könnte jetzt nicht zeichnen, nicht einen Strich, und bin nie ein größerer Maler gewesen als in diesen Augenblicken. Wenn das liebe Tal um mich dampft, und die hohe Sonne an der Oberfläche der undurchdringlichen Finsternis meines Waldes ruht, und nur einzelne Strahlen sich in das innere Heiligtum stehlen, ich dann im hohen Grase am fallenden Bache liege, und näher an der Erde tausend mannigfaltige Gräschen mir merkwürdig werden; wenn ich das Wimmeln der kleinen Welt zwischen Halmen, die unzähligen, unergründlichen Gestalten der Würmchen, der Mückchen näher an meinem Herzen fühle, und fühle die Gegenwart des Allmächtigen, der uns nach seinem Bilde schuf, das Wehen des Alliebenden, der uns in ewiger Wonne schwebend trägt und erhält; mein Freund! Wenn's dann um meine Augen dämmert, und die Welt um mich her und der Himmel ganz in meiner Seele ruhn wie die Gestalt einer ";
        String matchNot = "äöüß";
        matchNot += matchNot.toUpperCase();
        matchNot += "\\w\\s";
        Matcher matcher = Pattern.compile("([" + matchNot + "]*)([^" + matchNot + "])").matcher(string);
        while (matcher.find()) {
            string2 += matcher.group(1) + "...aeh..." + "\n";
        }
        System.out.println(string2);
    }

Ausgabetext
Code:
Eine wunderbare Heiterkeit hat meine ganze Seele eingenommen...aeh...
 gleich den süßen Frühlingsmorgen...aeh...
 die ich mit ganzem Herzen genieße...aeh...
 Ich bin allein und freue mich meines Lebens in dieser Gegend...aeh...
 die für solche Seelen geschaffen ist wie die meine...aeh...
 Ich bin so glücklich...aeh...
 mein Bester...aeh...
 so ganz in dem Gefühle von ruhigem Dasein versunken...aeh...
 daß meine Kunst darunter leidet...aeh...
 Ich könnte jetzt nicht zeichnen...aeh...
 nicht einen Strich...aeh...
 und bin nie ein größerer Maler gewesen als in diesen Augenblicken...aeh...
 Wenn das liebe Tal um mich dampft...aeh...
 und die hohe Sonne an der Oberfläche der undurchdringlichen Finsternis meines Waldes ruht...aeh...
 und nur einzelne Strahlen sich in das innere Heiligtum stehlen...aeh...
 ich dann im hohen Grase am fallenden Bache liege...aeh...
 und näher an der Erde tausend mannigfaltige Gräschen mir merkwürdig werden...aeh...
 wenn ich das Wimmeln der kleinen Welt zwischen Halmen...aeh...
 die unzähligen...aeh...
 unergründlichen Gestalten der Würmchen...aeh...
 der Mückchen näher an meinem Herzen fühle...aeh...
 und fühle die Gegenwart des Allmächtigen...aeh...
 der uns nach seinem Bilde schuf...aeh...
 das Wehen des Alliebenden...aeh...
 der uns in ewiger Wonne schwebend trägt und erhält...aeh...
 mein Freund...aeh...
 Wenn...aeh...
s dann um meine Augen dämmert...aeh...

?

Anstatt string2 jetzt einfach StringBuilder.

Da wir die Machter und Pattern noch nicht hatten, wird das wohl nicht so erwartet. Da ich aber etwas Ahnung von dem Thema habe, wollte ich es so in meiner Freizeit mal probieren. Wir sollten, da wir erst StringBuilder Methoden "gelernt" haben, diese auch anwenden.

Habe nur ein Problem. Ein sehr äquivalentes Problem wie am Anfang. Einziger Unterschied. Wir sollen den String, wieder in den ursprünglichen String zurückbasteln. Also die ganzen ...aeh... durch . ersetzen.

Code:
for(int i = 0; i < stoiber.length(); i++) {
            if(isExactString(stoiber.substring(i, i+aehLength), AEH)) {
                stoiber.replace(i, i + aehLength, point );       
            }
        }
        System.out.println(stoiber);
    }
   
    static boolean isExactString(String str, String test) {
        return str.equals(test);
    }
Einerseits glaube ich allgemein, das es viel einfacher geht, aber ist momentan auch egal. 😀 Habe jedenfalls wieder eine StringIndexOutOfBoundsException. Allerdings, glaube ich das es jetzt daran liegt, dass der String immer kleiner wird und dann die Methode substring keinen String am Ende mehr hinbekommt. Quasi das gleiche Problem, nur bisschen anderes. Beim ersten Problem, habe ich mich nach der Erklärung vorn @mrBrown sogar geschämt. 😀
Hoffe ich muss mich nicht schon wieder schämen.
 
Nungut - Pattern und Matcher verzichtbar das kann man nachvollziehen.
Dann müssen im Übereinstimmungsteilstring genau umgekehrt solche Zeichen stehen
wie . (Punkt) usw auf die gematcht werden sollen.
Du durchläufst dann den String, testest auf das Zeichen ===>
  1. match:
    1. match durch aeh ersetzen
  2. kein match:
    1. keinMatch nicht ersetzen
Dass diese unregelmäßigkeit beim Index beim Erhöhen ignoriert werden kann,
dafür Ersetzungen im gleichen String nicht machen -
sondern im zweiten String machen. 😕

(Ich weiß es klang furchtbar, aber habe jetzt kein es korrekt aufzuschreiben,
Ersetzungen einfach nicht in-place abarbeiten 😱 )
 
Habe nur ein Problem. Ein sehr äquivalentes Problem wie am Anfang. Einziger Unterschied. Wir sollen den String, wieder in den ursprünglichen String zurückbasteln. Also die ganzen ...aeh... durch . ersetzen.

Code:
for(int i = 0; i < stoiber.length(); i++) {
            if(isExactString(stoiber.substring(i, i+aehLength), AEH)) {
                stoiber.replace(i, i + aehLength, point );      
            }
        }
        System.out.println(stoiber);
    }
  
    static boolean isExactString(String str, String test) {
        return str.equals(test);
    }
Einerseits glaube ich allgemein, das es viel einfacher geht, aber ist momentan auch egal. 😀 Habe jedenfalls wieder eine StringIndexOutOfBoundsException. Allerdings, glaube ich das es jetzt daran liegt, dass der String immer kleiner wird und dann die Methode substring keinen String am Ende mehr hinbekommt. Quasi das gleiche Problem, nur bisschen anderes. Beim ersten Problem, habe ich mich nach der Erklärung vorn @mrBrown sogar geschämt. 😀
Hoffe ich muss mich nicht schon wieder schämen.
Naja, das Problem ist quasi das gleiche - diesmal läuft i bis zum letzten Zeichen, und dann addierst du beim prüfen noch aehLength drauf. Damit i+aehLength nicht außerhalb des Strings ist, musst du die Bedingung beim for entsprechend anpassen, sodass auch i+aehLength immer noch ein gültiger Index ist 😉
 
Machs doch so
Java:
    public static void main(String[] args) {
        String string2 = ""; // or: string builder
        String string
                = "Eine wunderbare Heiterkeit hat meine ganze Seele eingenommen, gleich den süßen Frühlingsmorgen, die ich mit ganzem Herzen genieße. Ich bin allein und freue mich meines Lebens in dieser Gegend, die für solche Seelen geschaffen ist wie die meine. Ich bin so glücklich, mein Bester, so ganz in dem Gefühle von ruhigem Dasein versunken, daß meine Kunst darunter leidet. Ich könnte jetzt nicht zeichnen, nicht einen Strich, und bin nie ein größerer Maler gewesen als in diesen Augenblicken. Wenn das liebe Tal um mich dampft, und die hohe Sonne an der Oberfläche der undurchdringlichen Finsternis meines Waldes ruht, und nur einzelne Strahlen sich in das innere Heiligtum stehlen, ich dann im hohen Grase am fallenden Bache liege, und näher an der Erde tausend mannigfaltige Gräschen mir merkwürdig werden; wenn ich das Wimmeln der kleinen Welt zwischen Halmen, die unzähligen, unergründlichen Gestalten der Würmchen, der Mückchen näher an meinem Herzen fühle, und fühle die Gegenwart des Allmächtigen, der uns nach seinem Bilde schuf, das Wehen des Alliebenden, der uns in ewiger Wonne schwebend trägt und erhält; mein Freund! Wenn's dann um meine Augen dämmert, und die Welt um mich her und der Himmel ganz in meiner Seele ruhn wie die Gestalt einer ";
        String match = "";
        byte[][] notr = {
            {0, 32},
            {47, 57},
            {65, 90},
            {97, 122},
            {127, 127}
        };
        O:
        for (byte i = 0; i >= 0; i++) {
            for (byte[] bs : notr) {
                if (i >= bs[0] && i <= bs[1]) {
                    continue O;
                }
            }
            match = match + (char) i;
        }
        for (int i = 0; i < string.length();) {
            if (match.contains(String.valueOf(string.charAt(i)))) {
                string =  string.substring(0, i) + "...aeh..." + "\n"
                        + string.substring(i + 1);
                i = i + "...aeh...\n".length();
            } else {
                i++;
            }
        }
        System.out.println(string);
    }
 

Neue Themen


Zurück
Oben