StringBuilder

Status
Nicht offen für weitere Antworten.

Schwede

Mitglied
Ich hab folgendes Probleme und zwar möchte ich,

das meine Methode einen String liefert der alle in "par" enthaltenen Dezimalziffern
('0' bis '9') in der gleichen Reihenfolge enthält.

wie zum Beispiel: ("Euro 17 Cent 25") ist gleich "1725"

Ich hab das Programm auch fast fertig, denke ich, nur ich komm bei der if-anweisung nicht weiter, kann mir vllt jmd helfen?!?!

Der Code sieht wie folgt aus:

Code:
   static public void main(String[] sonja)
   {
	    String par="Euro 17 Cent 25";
	    StringBuilder sb=new StringBuilder(par);

	    for(int i=0;i<sb.length();i++)
	    {
		char c= sb.charAt(i);
		if(c>'9' && c<'0')
		{
		    sb.deleteCharAt(i);
		}
	    }


   }
 
> if(c>'9' && c<'0')

->

if(c>'9' || c<'0')

----

etwas speicherfreundlicher wäre noch, von hinten erst die letzten Zeichen zu löschen,
dann müssen nicht so viele verschoben werden,

aber StringBuilder statt String ist schon die entscheidene Sache, gut
 
cool danke funktioniert...

bloß jetzt ist mir eins aufgefallen, und zwar wenn ich meine Methode so schreibe:

Code:
static public String blanksRaus ()
   {
	  String par="Euro 17 Cent 25";
	  StringBuilder sb=new StringBuilder(par);

	  [B][I][COLOR="Red"]for(int i=sb.length()-1;i>=0;i--)[/COLOR][/I][/B]
	  {
	  	char c= sb.charAt(i);
	  	if(c>'9' || c<'0')
	  	{
	  		sb.deleteCharAt(i);
	  	}
	  }
	  return sb.toString();
   }

dann bringt er das Ergebnis: 1725

wie ich es haben will aber wenn ich meine Methode so schreibe:

Code:
static public String blanksRaus ()
   {
	  String par="Euro 17 Cent 25";
	  StringBuilder sb=new StringBuilder(par);

	  [B][I][COLOR="red"]for(int i=0;i<sb.length();i++)[/COLOR][/I][/B]
	  {
	  	char c= sb.charAt(i);
	  	if(c>'9' || c<'0')
	  	{
	  		sb.deleteCharAt(i);
	  	}
	  }
	  return sb.toString();
   }

da bringt er mir: uo17Cn 25

WARUM???

bei der einen Methode zählt man von anfang bis ende
und bei der anderen doch nur vom ende bis zum anfang, oder täusche ich mich da?
 
du entfernst einen char, also musst du wieder von i abziehen, also so:
Java:
sb.deleteCharAt(i--);
 
was ist denn das für ein irrer Vorschlag?

sb.deleteCharAt(i);
den i-ten Char löschen, soweit alles klar

DANACH dann evtl. als zweiter Befehl
i--;
um für den nächsten Schleifendurchlauf i zu korrigieren,
aber um Himmels Willen doch nicht zusammengemoppelt
 
Code:
sb.deleteCharAt(i--);
und
Code:
sb.deleteCharAt(i);
i--;
bewirken doch das gleiche? Ist natürlich wie so oft Ansichtssache, was man leserlicher findet, aber bei solch kleinen Ausdrücken sehe ich kein Problem bei der ersten Methode.
Wenns um Leserlichkeit geht, sollte man eher bemängeln, dass die Laufvariable innerhalb der Schleife bedingt verändert wird...
 
ein Befehl pro Zeile hat noch niemanden geschadet, schon gar nicht in
"Java Basics - Anfänger Themen" 😉
 
Schon. Aber "irrer Vorschlag" und "um Himmels Willen doch nicht" kam mir dann doch etwas überzogen vor.
Hauptsache nicht sowas wie "x += x++ - x + --x;" oder so machen. 😉
 
etwas speicherfreundlicher wäre noch, von hinten erst die letzten Zeichen zu löschen
Noch besser ist es, gar nichts zu löschen:
Java:
public static String filter_digits(String string)
{
	char[] result = string.toCharArray();
	int size = 0;
	for (char c : result)
		if (Character.isDigit(c)) result[size++] = c;
	return new String(result, 0, size);
}
Schöner geht's mal wieder mit Haskell 😉
Code:
> filter isDigit "Euro 17 Cent 25"
"1725"
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben