Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Alle vorkommen eines Zeichens in StringBuffer Objekt löschen
Hallo Leute, ich möchte eine Klassenmethode schreiben, die alle vorkommen eines bestimmten Zeichens in einem StringBuffer Objekt löscht.
hier meine Lösung, die nicht richtig funktioniert:
Code:
public class Loeschen
{
static void loeschen(StringBuffer sb, char c)
{
for(int i = 0; i < sb.length(); i++)
{
if(sb.charAt(i) == c)
{
sb.deleteCharAt(i);
}
}
}
public static void main(String[] args)
{
StringBuffer test = new StringBuffer("oeeeeo");
loeschen(test, 'e');
System.out.println(test);
}
}
Meine Lösung löscht bis zu zwei Zeichen hintereinander, aber wenn es mehr Zeichen hintereinander sind, löscht sie nicht alle, was ich nicht verstehe, weil die Schleife ja jedes einzelne Indize nacheinander durchgeht, nachschaut ob das gesuchte Zeichen mit der aktuellen Position übereinstimmt und es dann ggf. löscht. Kann mir da jemand bitte auf die Sprünge helfen?
In der Hoffnung, dass du das noch liest: Dein Code folgt einem schlechten Programmierstil. Du übergibst eine Referenz an eine Methode und veränderst dort das Objekt auf das sie zeigt. Das ist fehleranfällig und schwer nachzuvollziehen. Arbeite lieber mit unveränderlichen Objekten und seiteneffektfreien Methoden (Methoden, die keine Veränderungen an der Außenwelt vornehmen):
Java:
String delete(final String str, final char c) {
final StringBuilder sb = new StringBuilder(str.length());
for (final char s : str.toCharArray()) {
if (s != c) {
sb.append(s);
}
}
return sb.toString();
}
Nebeneffekt ist, dass viele Probleme gleich viel einfacher zu lösen sind. Hier z.B. musst du nur alle Zeichen ungleich des gesuchten Zeichens umkopieren.
Mhm naja...in deinem Beispiel (Methodensignatur, Rückgabe etc. ) würde wohl auch ein einfaches
Code:
return str.replace(String.valueOf(c), "");
reichen
Aber er will ja a) den SB beibehalten und b) ein SB übergeben, was soll also am Löschen im SB so schlimmes sein? ;/ Es ist ja eben eine "mutable sequence of characters" :bae:
Ich sehe keinen Grund methodenübergreifend mit veränderlichen Objekte zu hantieren. Das sorgt nur für Instabilität und Unklarheit über den Ablauf des Codes. Den Overhead von ein paar Millisekunden durch die Alternative, nämlich unveränderliche Objekte, nehme ich dagegen gerne ich Kauf.
public class Loeschen
{
static void loeschen(StringBuffer sb, char c)
{
for(int i = sb.length()-1; i >= 0; i--)
{
if(sb.charAt(i) == c)
{
sb.deleteCharAt(i);
}
}
}
public static void main(String[] args)
{
StringBuffer test = new StringBuffer("oeeeeo");
loeschen(test, 'e');
System.out.println(test);
}
}