Erste Schritte Vokale im Satz ersetzen

Vladyslav

Mitglied
Guten Tag,

ich stehe auf dem Schlauch (und Java ist ein Insel hilft mir gerade auch nicht besonders ).
Meine Aufgabe ist es in einem eingegebenem String alle Vokale also a e i o u durch durch ba be bi etc... zu ersetzen.
Soweit so gut. Dazu darf ich aber nur die Methoden toCharArray und String.ValueOf benutzen.

Ich komme einfach den markierten Zeile nicht weiter. Der Gedankengang ist, dass ich einen eingegebenen String erstmal in ein Char Array umwandle. Danach bestimme ich die Länge, erzeuge einen neuen Array der genauso lang sein soll.

Und jetzt steh ich auf dem Schlauch.
Ich soll den eigegebenen String Zeichen für Zeichen durchgehen und die besonderen Wörter im Array2 verändert speichern.
Zum Schluss gebe ich den veränderten String dann aus.

Code:
import java.util.Scanner;

public class L7UB4_B_Sprachen_Spiel {
    public static String spielen(String x)
    {



        char [] array = x.toCharArray();
        int leange =array.length;
        char [] array2 = new char [leange];

        for (int i = 0; i<leange;i++)  // von hier  xxxxxxxxxxxxxxxxxxxxxxxxxx
        {
            char c = x.charAt(i);



        }
        String str = String.valueOf(array2); // bis hier xxxxxxxxxxxxxxxxxxxx

        return str;
    }

    public static void main (String [] args)
    {
        String eingabe;
        String verarbeitung;
        Scanner scanner = new Scanner (System.in);

        System.out.println("Bitte gib hier ein Satz ein");
        eingabe = scanner.nextLine();

        verarbeitung = spielen(eingabe);

        System.out.println("Deine Eingabe in B-Sprache: "+verarbeitung);
    }
}


mfG
 
Hallo Vlady. Ich habe mal deinen Scanner ersetzt... Ansonsten würde ich es so lösen, dass ich eine Liste baue und beim Iterieren halt kucke, ob c ein Vokal ist. Wenn ja, hänge ich noch das b davor, ansonsten hänge ich nur den Kosonaten an den Result-String.

Java:
import java.util.Arrays;
import java.util.List;

public class L7UB4_B_Sprachen_Spiel {

    public static String spielen(String x) {

        char[] array = x.toCharArray();

        int leange = array.length;

        String str = "";

        // Ich bau mir eine Vokalliste
        List<String> vowels = Arrays.asList(
                new String[] { "a", "e", "i", "o", "u", "ä", "ö", "ü", "A", "E", "I", "O", "U", "Ä", "Ö", "Ü" });

        for (int i = 0; i < leange; i++) {

            char c = x.charAt(i);

            // Wenn c in dieser Liste drinne ist, dann hänge ich ein b und den Vokal an den
            // String str...
            if (vowels.contains(String.valueOf(c))) {

                str += "b";
                str += c;

            } else {

                // ansonsten hänge ich den Konsonanten an den String str.
                str += c;

            }

        }

        return str;
    }

    public static void main(String[] args) {

        String eingabe;
        String verarbeitung;

        eingabe = "Ich singe lustige Lieder";

        verarbeitung = spielen(eingabe);

        System.out.println("Deine Eingabe in B-Sprache: " + verarbeitung);
    }
}
 
Java:
String a = "shahakdbuo";
System.out.println(a.replaceAll("a", "ba").replaceAll("e", "be").replaceAll("i", "bi").replaceAll("o", "bo").replaceAll("u", "bu"));

Edit: Ich hatte gerade gemerkt, dass du nur toCharArray und String.valueOf benutzen darfst, somit ist meine Lösung überflüssig.
 
Danke erstemal an alle fürs helfen 🙂 !
@ pkm, würde "List<String>" den nicht der Vorraussetzung widersprechen, dass alle Methoden der Klasse String außer toCharArray(), und String.vlueOf () verwendet werden dürfen ? Ansonsten ist deine Lösung toll ! Danke für die Kommentare hätte es sonst nicht verstanden. 🙂
 
Vlady, "contains" ist ja eine List-Methode und keine String Methode. An einem String-Objekt habe ich soweit ich weiß keine andere Methode aufgerufen als valueOf oder toCharArray.
 
Aber ansonsten sollte das doch kein Problem sein. Du wandelst den String in ein char-Array um. A e i o u sind chars. Einmal durch das Array durchgehen, chars vergleichen und entsprechend wieder einen String zusammenbauen. Fertig.
 
Ich hab mich mal inspirieren lassen und es mal etwas anders versucht.
Ich weiß die Zeilen
resultat += 'b';
resultat += c;
gehen nicht auf, weil damit ja zwei Zeichen auf ein Char-Platz zwischengespeichert werden. Gibt es da vll. eine Lösung ?



Code:
public static String spielen(String x)
    {



        char [] array = x.toCharArray();
        int count = 0;
        int leange =array.length;
        char [] resultat = new char [leange];
        String str = "";

        for (int i = 0; i<leange;i++)
        {
            char c = x.charAt(i);
            if ( c == 'a' || c == 'e' ||c == 'i' ||c == 'o' ||c == 'u') {

                resultat[i] += 'b';
                resultat[i] += c;
            }
            else
            {
                resultat[i]=c;
        }

        }
        str = String.valueOf(resultat);

        return str;
    }
 
Also wenn Du vorher ermitteln könntest, die groß das Ziel-Array sein muss, dann könntest Du aus einem Zeichen ja zwei Zeichen machen....

Hilft Dir dieser Hinweis schon?
 
@ JustNobody, verstehe ich es richtig ?

Also ich würde als erstes eine Methode schreiben der den eigegebenen Satz aufruft und die Vokale z.B. mit int Count = 0; Count ++; zählt .

Als nächstes habe ich eine Methode wie oben, die den eingegebenen String in ein Char Array umwandelt, dazu kommt aber noch der neue Wert von Count dazu ?
 
Du musst Dir die Lösung doch überlegen. Wenn du "abcdef" als String bekommst, dann ist der 6 Zeichen lang. Das Ergebnis soll aber nun "babcdbef" sein. Jetzt musst Du Dir überlegen, was für Mittel Du hast und was Du einsetzen willst.

Also wenn Du den Weg gehen willst: String -> char-array -> Zeichen in neues char-array kopieren -> String, dann musst Du für den Schritt, dass Du Zeichen in ein Ziel-Array kopieren willst, das Array mit der richtigen Größe anlegen.

Also brauchst Du zwei Dinge:
a) Du musst die Größe des Ziel-Arrays ermitteln können, entweder exakt oder vielleicht kannst Du eine Größe angeben, die auf jeden Fall reicht?
b) Du musst die Zeichen richtig kopieren können

Generell ist Dein Ansatz richtig: Das sind erst einmal zwei Schritte - die kannst Du nacheinander durchführen und wirklich einzeln angehen.

Wichtig ist immer, dass man irgend einen Tot sterben muss: Man kann die genaue Anzahl ermitteln und dann spart man Speicher. Oder man spart die Rechenzeit und nimmt einfach ein Array, in das es auf jeden Fall rein passt.

Dann ist nur die Frage, wie man das zu lange Array in einen String zurück bekommt. Wenn man sich die String Klasse anschaut, dann sieht man zwei valueOf Methoden, die ein Array von Chars annehmen. Die Zweite bekommt aber noch zusätzlich offset und count mit. 🙂
 
@JustNobody habs mal versucht, habe aber ein Logic-Error drin. Das Programm startet ganz normal, der Debugger kommt auch durch, doch dann bricht es einfach ab ohne der Ausgabe der Lösung... bin grad 10 mal oder durchgegangen.




Code:
public class L7UB4_B_Sprachen_Spiel {
    public static int vokaleZaehler(String x) { // dise Methode zählt einfach nur die Vokale
        int count = 0;
        for (int i = 0; i < x.length(); i++) {
            char c = x.charAt(i);
            if ( c == 'a' || c == 'e' ||c == 'i' ||c == 'o' ||c == 'u'){
                count++;
            }
        }
        return count;
    }

    public static String spielen(String x)
    {
        int laenge = x.length();
        int grenzwert = laenge +1;
        char [] array = x.toCharArray();
        char [] resultat = new char [laenge+vokaleZaehler(x)];
        String str = "";

        for (int i = 0,j=0;i <=grenzwert;i++,j++)
        {

            if (array [i] == 'a' || array [i] == 'e' || array [i]=='i' || array [i]=='o' || array [i]=='u') {

                resultat[j] += 'b';
                j++;
                resultat[j] +=array[i];


            }
            else {
                resultat[j] = array[i];
            }


        }
        str = String.valueOf(resultat);

        return str;
    }

    public static void main (String [] args)
    {
        String eingabe;
        String verarbeitung;
        Scanner scanner = new Scanner (System.in);

        System.out.println("Bitte gib hier ein Satz ein");
        eingabe = scanner.nextLine();

        int counter = vokaleZaehler(eingabe);

        verarbeitung = spielen(eingabe);

        System.out.println("So viele böse Vokale :" +counter);

        System.out.println("Deine Eingabe in B-Sprache: "+verarbeitung);
    }
}
 
Hatte die Bedienung in der Forschleife falsch gesetzt... naja Habs vielen DANK !
Code:
public class L7UB4_B_Sprachen_Spiel {
    public static int vokaleZaehler(String x) { // dise Methode zählt einfach nur die Vokale
        int count = 0;
        for (int i = 0; i < x.length(); i++) {
            char c = x.charAt(i);
            if ( c == 'a' || c == 'e' ||c == 'i' ||c == 'o' ||c == 'u'|| c == 'A' || c =='E' || c=='I' || c =='O'|| c=='U')
            {
                count++;
            }
        }
        return count;
    }

    public static String spielen(String x)
    {
        int laenge = x.length();
        char [] array = x.toCharArray();
        char [] charArrayResultat = new char [laenge+vokaleZaehler(x)];
        String str ="";

        for (int i = 0,j=0;i <laenge;i++,j++)
        {

            if (array [i] == 'a' || array [i] == 'e' || array [i]=='i' || array [i]=='o' || array [i]=='u'|| array [i] == 'A' || array [i]=='E' || array [i]=='I' || array [i]=='O'|| array [i]=='U') {

                charArrayResultat[j] += 'b';
                j++;
                charArrayResultat[j] +=array[i];


            }
            else {
                charArrayResultat[j] = array[i];
            }
            str = String.valueOf(charArrayResultat);


        }

        return str;
    }

    public static void main (String [] args)
    {
        String eingabe;
        String verarbeitung;
        Scanner scanner = new Scanner (System.in);

        System.out.println("Bitte gib hier ein Satz ein");
        eingabe = scanner.nextLine();

        int counter = vokaleZaehler(eingabe);
        verarbeitung = spielen(eingabe);

        System.out.println("So viele böse Vokale :" +counter);

        System.out.println("Deine Eingabe in B-Sprache: "+verarbeitung);
    }
}
 
Zuletzt bearbeitet:
Aber ansonsten sollte das doch kein Problem sein. Du wandelst den String in ein char-Array um. A e i o u sind chars. Einmal durch das Array durchgehen, chars vergleichen und entsprechend wieder einen String zusammenbauen. Fertig.
Man könnte doch schon in der Schleife den neuen String erstellen 😉 Somit wäre das Array Problem gelöst xD
Java:
        String s = "shahakdbuo";

        char[] arr = s.toCharArray();

        String result = "";

        for(char c : arr) {
            if ( c == 'a' || c == 'e' ||c == 'i' ||c == 'o' ||c == 'u') {
                result += 'b';
            }

            result += c;
        }

        System.out.println(result);
 
Zuletzt bearbeitet:
Die Aufgabe habe ich aber explizit so verstanden, dass eben toCharArray und valueOf verwendet werden soll und jede anderweitige Benutzung von Strings explizit verboten ist.

Damit fällt diese Lösung doch aus.

Und @Vladyslav: An Deiner Lösung solltest Du noch etwas anpassen:
Java:
charArrayResultat[j] += 'b';
                j++;
                charArrayResultat[j] +=array[i];

Dieses += solltest Du durch = ersetzen. Es kommt zwar dennoch das Richtige raus, aber das liegt einfach nur daran, dass das Array mit 0 Werten gefüllt ist und daher immer 0 + ... gerechnet wird.

Aber wir wollen hier eine einfache Zuweisung und keine Addition.
 
Und weil wir ja schon zwei Lösungsideen hatten, einfach noch einmal die zweite Variante ohne Zählen 8Also Ziel-Array wird auf doppelte Größe gesetzt und dann werden nur die gesetzten Elemente beim valueOf berücksichtigt.:

Code:
public static String spielen(String x)
    {
        int laenge = x.length();
        char [] array = x.toCharArray();
        char [] charArrayResultat = new char [laenge * 2]; // Doppelte Länge ist das maximale, das wir brauchen (für den Fall, dass alles Vokale sind!)
        String str ="";
        
        int positionNeu=0;
        for (int positionAlt = 0; positionAlt < laenge; positionAlt++)
        {
            if (array [positionAlt] == 'a' || array [positionAlt] == 'e' || array [positionAlt]=='i' || array [positionAlt]=='o' || array [positionAlt]=='u'|| array [positionAlt] == 'A' || array [positionAlt]=='E' || array [positionAlt]=='I' || array [positionAlt]=='O'|| array [positionAlt]=='U') {
                charArrayResultat[positionNeu] += 'b';
                positionNeu++;
            }
            charArrayResultat[positionNeu] +=array[positionAlt];
            positionNeu++;
        }
        return String.valueOf(charArrayResultat, 0, positionNeu); // Nur die ersten positionNeu Elemente umwandeln.
    }

Das ist natürlich einfach so im Editor entstanden - also ggf. mit Tippfehlern oder so. Und evtl. ist beim Refactoring was übersehen worden und man hat noch ein i oder j irgendwo.

Und beim Schreiben ist noch aufgefallen:
In der Schleife musst Du kein String.valueOf aufrufen. So berechnest Du derzeit in jedem Durchlauf ein neues str. Aber Du musst es ja nur einmal nach der Schleife machen.
 
Die Aufgabe habe ich aber explizit so verstanden, dass eben toCharArray und valueOf verwendet werden soll und jede anderweitige Benutzung von Strings explizit verboten ist.
Kann sein. Kann aber auch sein, dass man nur keine andere Methode von String verwenden darf.

Das kann er ja dann selbst entscheiden, nachdem er selbst eine funktionierende Lösung hat, wollte ich einfach nur eine Alternative zeigen.
 

Zurück
Oben