Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String

Jakonfire

Mitglied
Dem Programm werden zwei Strings übergeben. Der erste "alphabet" ist der String in dem später die im zweiten String "zeichenfolge" stehenden Zeichen verschoben werden, jeweils um den in "verschiebung" übergebenen Wert. Funktioniert leider aber nicht, vielleicht kann jemand helfen.

Fehlermeldung: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 15

Als Bsp.: alphabet: "01234567890+-*/"
zeichenfoolge: "2 * 21 = 42"
verschiebung: 3

erwartete Ausgabe: "5 1 54 = 75"

Java:
public class Verschiebung {
    public static void main(String[] args) {
        String alphabet = args[0];
        String zeichenfolge = args[1];
        int verschiebung = Integer.parseInt(args[2]);
        int length = zeichenfolge.length();
        int length2 = alphabet.length();
        int vorne = 0; 
        int vorne2 = 0; 
        int hinten = length -1;
        int hinten2 = length2 -1; 
        
        String ausgabe1 = "";
        
    while (hinten > vorne){
        char zeichen = zeichenfolge.charAt(vorne++);
        while (hinten2 > vorne){
            char stelle = alphabet.charAt(vorne2++);
            if (zeichen == stelle){
                ausgabe1 = ausgabe1 + alphabet.charAt((vorne+verschiebung)); 
            }
            else{
            ausgabe1 = ausgabe1 + (char)zeichen;
            }
        }

    }
    System.out.println(ausgabe1);  
    }
}
 
Diese wird auftreten, wenn du das Zeichen „*“ betrachtest. Hier musst du, wenn du am Ende deines Alphabets Strings angekommen bist, wieder an den Anfang springen 😉
 
Also eigentlich musst du folgendes machen:

Du iterierst über deinen zweiten String. Für jedes Zeichen suchst du den Index des betrachteten Zeichens in deinem Alphabet String. Nun gehst du zwei Stellen weiter. Hier gibt es Sonderfälle die du abfangen musst. Ein Beispiel:

Du befindest dich genau am Ende deines Alphabets (somit length()-1) und willst zwei Stellen weiter, dann müsstest du wieder sn den Anfang deines Alphabetsstring springen.
 
Also eigentlich musst du folgendes machen:

Du iterierst über deinen zweiten String. Für jedes Zeichen suchst du den Index des betrachteten Zeichens in deinem Alphabet String. Nun gehst du zwei Stellen weiter. Hier gibt es Sonderfälle die du abfangen musst. Ein Beispiel:

Du befindest dich genau am Ende deines Alphabets (somit length()-1) und willst zwei Stellen weiter, dann müsstest du wieder sn den Anfang deines Alphabetsstring springen.
Ich habe das ganze noch mal komplett neu geschrieben und jetzt wird auch erkannt an welcher Stelle der Buchstabe steht nur bricht es jetzt nach dem ersten korrekt ausgegebenem Zeichen bei dem folgenden das nicht enthalten ist ab und gibt Fehlermeldung aus: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 32

Java:
public class Verschiebung {
    public static void main(String[] args) {
        String alphabet = args[0];
        String zeichenfolge = args[1];
        int verschiebung = Integer.parseInt(args[2]);
        int position = 0;
        int length = zeichenfolge.length();
        int length2 = alphabet.length();
        boolean enthalten = false; 
    
    for (int i = 0; i < length; i++){
        char zeichen = zeichenfolge.charAt(i);

            for (int j = 0; j < length2; j++){
            
                if (zeichen == alphabet.charAt(j)){
                enthalten = true;
                position = j;
                break;   
                }
                else {
                enthalten = false;     
                }
            }
        if (enthalten == true){
            System.out.print(alphabet.charAt(position+verschiebung));
            }
        if (enthalten == false){
            System.out.print(alphabet.charAt(zeichen));
            }   
    }   
    }
    
}
 
Naja wenn du position+verschiebung tritt das auf, da du nicht berücksichtigst, dass das Zeichen am ende des Alphabets ist 😉 wenn index = length()-1 dann musst du wieder bei index = 0 anfangen 😉
 
Naja wenn du position+verschiebung tritt das auf, da du nicht berücksichtigst, dass das Zeichen am ende des Alphabets ist 😉 wenn index = length()-1 dann musst du wieder bei index = 0 anfangen 😉
Aber nur bei der Berechnung oder? Also wenn der Index des errechneten Zeichens die länge überschreitet muss ich die länge des strings abziehen um wieder am korrekten Index zu sein?
 
Funktioniert fast. Ausgabe: 515475
Erwartet: 5 1 54 = 75

Edit: Auch so gibt er leider nicht die nicht enthaltenen Zeichen aus
if (enthalten != true){
System.out.print(zeichenfolge.charAt(i));
}

Java:
public class Verschiebung {
    public static void main(String[] args) {
        String alphabet = args[0];
        String zeichenfolge = args[1];
        int verschiebung = Integer.parseInt(args[2]);
        int position = 0;
        int length = zeichenfolge.length();
        int length2 = alphabet.length();
        boolean enthalten = false;
   
    for (int i = 0; i < length; i++){
        char zeichen = zeichenfolge.charAt(i);

            for (int j = 0; j < length2; j++){
           
                if (zeichen == alphabet.charAt(j)){
                enthalten = true;
                position = j;
                break;  
                }
                else {
                enthalten = false;    
                }
            }
        if (enthalten == true){
            if ((position+verschiebung) > length2){
            System.out.print(alphabet.charAt(position+verschiebung-length2));
            }
            else {
            System.out.print(alphabet.charAt(position+verschiebung));
            }
        if (enthalten == false){
            System.out.print(alphabet.charAt(zeichen));
            }
        }  
    }  
    }
   
}
 
Zuletzt bearbeitet:
So jetzt funktioniert es egal welche Zeichen in beiden Strings enthalten. Danke!

Nur ein Testfall möchte nicht:

Arguments: abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz 5


Ausgabe: fghijklmnopqrstuvwxyz


Erwartet: fghijklmnopqrstuvwxyzabcde

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 26

Java:
public class Verschiebung {
    public static void main(String[] args) {
        String alphabet = args[0];
        String zeichenfolge = args[1];
        int verschiebung = Integer.parseInt(args[2]);
        int position = 0;
        int length = zeichenfolge.length();
        int length2 = alphabet.length();
        boolean enthalten = false;
  
    for (int i = 0; i < length; i++){
        char zeichen = zeichenfolge.charAt(i);

            for (int j = 0; j < length2; j++){
          
                if (zeichen == alphabet.charAt(j)){
                enthalten = true;
                position = j;
                break; 
                }
                else {
                enthalten = false;
                }
            }
        if (enthalten == true){
            int pruefe = position+verschiebung;
            while (pruefe > length2){
            pruefe = pruefe - length2;
            }
            if ((pruefe) <= length2){
            System.out.print(alphabet.charAt(pruefe));
            }
        } 
        if (enthalten != true){
            System.out.print(zeichenfolge.charAt(i));
            }
    } 
    }
  
}
 
Zuletzt bearbeitet:
Also erstmal ein kleiner Tipp 😉 Lagere Dinge in Methoden aus, dann wird der Code leserlicher und du siehst Fehler schneller 😉

So sollte es funktionieren 😉

Java:
public class Verschiebung {
    
    public static void main(String[] args) {
        
        String alphabet = args[0];
        String zeichenfolge = args[1];
        int verschiebung = Integer.parseInt(args[2]);
        int position = 0;
        int length = zeichenfolge.length();
        int length2 = alphabet.length();
        StringBuilder sb = new StringBuilder();
 
        for (int i = 0; i < length; i++){
            char zeichen = zeichenfolge.charAt(i);
            position = checkAlphabet(alphabet, zeichen);
            if (position != -1){
                int pruefe = position+verschiebung;
                if(pruefe >= length2){
                    pruefe = pruefe - length2;
                }
                if (pruefe < length2){
                    sb.append(alphabet.charAt(pruefe));
                }
            }else{
                sb.append(zeichenfolge.charAt(i));
            }
        }
        System.out.println(sb.toString());
    }
    
    private static int checkAlphabet(String alphabet, char zeichen){
        for (int j = 0; j < alphabet.length(); j++){
              if (zeichen == alphabet.charAt(j)){
                return j;
            }
        }
        return -1;
    }
}
 
Zuletzt bearbeitet:
Hiermit sollte es klappen:
[CODE lang="java" title="Verschieben"]public class Zeichenkette {
public static String verschieben(String a, String s, int n) {
String erg = "";
// Durchlaufe jeden Character in der Zeichenkette
for (int i = 0; i < s.length(); ++i) {
// Berechne nur, wenn der aktuelle Character kein Leerzeichen und kein Gleichheitszeichen ist
if (s.charAt(i) != ' ' & s.charAt(i) != '=') {
/*
* 1) Ermittle Character an Position i in s
* 2) Ermittle Position des Characters aus s in a
* 3) Die Verschiebung ergibt den Character in a an Position ((|a| + n) mod |a|)
*/
erg += a.charAt((a.indexOf(s.charAt(i)) + n) % a.length());
} else {
erg += s.charAt(i);
}
}
return erg;
}
}
[/CODE]
 
Zuletzt bearbeitet:

Zurück
Oben