Alle vorkommen eines Zeichens in StringBuffer Objekt löschen

Kenelope

Mitglied
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?

mfg
Kenelope
 
Das Problem ist, dass beim löschen eines zeichens alle nachvollgenden Zeichen nach vorne rutschen.
Nach dem
Code:
sb.deleteCharAt(i);
sollte ein
Code:
i--;
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.
 
Das Problem ist, dass beim löschen eines zeichens alle nachvollgenden Zeichen nach vorne rutschen.
Nach dem
Code:
sb.deleteCharAt(i);
sollte ein
Code:
i--;
helfen.

Du kannst auch von hinten nach vorne iterieren.

Java:
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);
	}
}
 

Neue Themen


Zurück
Oben