Java schwierige Aufgabe alle Buchstaben eines Strings zwischen "z" und "p" entfernen wer kann mir helfen??
warum klappt meine Methode nicht? ich hab so gemacht wenn ein z und p erkannt wird wird b + "zp" gemacht falls nicht wird um 1 erhöht und der substring wird angefügt wer kann mir helfen?
Mit freundlichen Grüßen
4 Antworten
Wenn Du es selbst programmieren sollst, ist es einfacher, das erste 'z' und das letzte 'p' zu suchen und danach, wenn Fundstelle 2 nach Fundstelle 1 liegt, Zeichen ab Fundstelle1+1 bis Fundstelle2-1zu entfernen.
Bei i hast Du ein "z" entdeckt (allerdings kein "Z"). Wenn zwei Stellen weiter ein "p" ("P" würde nicht erkannt) auftaucht, dann b+="zp", b wird um zp ergänzt.
Wird kein z oder kein p erkannt, dann count erhöht (count++). Was soll jetzt diese Modulo-Bedingung? Macht keinen Sinn, und das ist schon ein Fehler. Was Du willst, ist doch b mit Zeichen befüllen, also b+=str.charAt[i]
for(int i=0;i<str.length()-2;++i){
if(str.charAt[i]=='z' && str.charAt[i]=='p'){
b+="zp";
i=i+3;}
else{
b+=str.charAt[i];
// oder wenn Dreierschritt auch hier zwingend:
// b+str.substring(i,i+2);i=i+3;
}
Habe es allerdings nicht getestet, bin auch kein Java-Nerd, man könnte es definitiv noch vereinfachen.
Man muss aber noch checken, was z.B. bei zzpp passieren soll, oder bei zzppzzppzzpp
Normalerweise gibt es für so etwas regulärere Ausdrücke. Wenn ausdrücklich der Weg zufuß gewünscht wird, kann ich eine Lösung anbieten, die ich allerdings in JScript und nicht in Java umgesetzt habe. Aufgrund der Ähnlichkeiten findest du vielleicht schnell die entsprechenden Pendants.
main()
function main()
{
var sResult
sResult = zipZap("zipXzap") + "\n";
sResult += zipZap("zopzop") + "\n";
sResult += zipZap("zzzopzop") + "\n";
sResult += zipZap("zibzap") + "\n";
sResult += zipZap("zip") + "\n";
sResult += zipZap("zi") + "\n";
sResult += zipZap("z") + "\n";
sResult += zipZap("") + "\n";
sResult += zipZap("zp") + "\n";
sResult += zipZap("abcppp") + "\n";
sResult += zipZap("azbcppp") + "\n";
sResult += zipZap("azbcpzp") + "\n";
MsgBox(sResult);
}
function zipZap(sZipZap)
{
var i;
var sRes = "";
for(i=0;i<sZipZap.length;i++)
if(!(!(i==0 || i>sZipZap.length-2) && sZipZap.substr(i-1,1) == "z" && sZipZap.substr(i+1,1) == "p"))
sRes += sZipZap.substr(i,1);
return sRes;
}
function MsgBox(sBody)
{
var shell = new ActiveXObject("wscript.shell");
shell.popup(sBody)
}
Ist ja klar dass das nicht funktioniert wenn du dir den algorithmus anguckst. Wenn das pattern nicht zutrifft dann fügst du da direkt 3 zeichen ein, gehst dann einen weiter, und fügst wieder 3 zeichen ein.
Sprich aus ABCDE wird ABCBCDCDE.
Macht keinen sinn so.
mach doch einfach
public String zipZap(String str) {
return str.replaceAll("z.p", "zp");
}
mehr muss in der methode nicht drin stehen. Kannst dir die schleife, counter und alles sparen. Warum das rad neu erfinden.
Wobei, da ist ja noch das count modulo 3, also kommt da was anderes raus. Aber wie gesagt, warum das rad neu erfinden wenns dafür schon ne stringmethode gibt.
Das ist gemeint als alle einzelnen buchstaben. Es sind ja ins gesamt mehrere buchstaben, aber pro z und p jeweils halt nur einer.
Auf dem bild ist das ja genauer formuliert mit Beispielen.
Aus zipXzap soll beispielsweise zpXzp werden. Bei deinem vorschlag wirds aber nur "zp".
WASSSSS SO EINFACH und ich zerbeiße mir 2 Stunden den Kopf WTF ok danke ich Versuchs morgen aus kein Bock grad bin am Ps4 zocken
Es sollte besser
heißen, sonst wird nur ein Zeichen entfernt.