Alphabet realisieren



  • Hallo,
    folgendes Problem: Ich habe einen Text in Großbuchstaben mit Sondernzeichen. Nun will ich alle Buchstaben jeweils um 3 Positionen im Alphabet verschieben, also eine Caesar-Chiffrierung durchführen.

    Meine erste Idee war es eine ArrayList mit allen Buchstaben des Alphabets zu erzeugen, dann alle Buchstaben des Textes einzeln zu vergleichen und gegebenenfalls zu ersetzten. Das Ganze klingt zwar simpel, ist in der Ausführung aber recht mühseelig, weil ich z.B. das komplette Alphabet erstmal per and in die ArrayList einfügen müsste und dann für jeden Buchstaben ein Character-Objekt anlegen müsste.

    Jetzt meine Frage, hätte jemand Ideen wie ich das Ganze einfacher und effizienter realisieren könnte ? Meine Methode erscheint mir sehr umständlich.

    Danke schonmal im Voraus.



  • Hier mal jetzt meine Version:

    public String MoveChar(String text, int r)
    {
    
    text = text.toUpperCase(Locale.getDefault()).trim()
    .replaceAll("Ü", "UE").replaceAll("Ö", "OE").replaceAll("Ä", "AE");
    
    StringBuffer sb = new StringBuffer(text);
    
    ArrayList alphabet = new ArrayList();
    alphabet.add(new Character('A'));
    alphabet.add(new Character('B'));
    alphabet.add(new Character('C'));
    alphabet.add(new Character('D'));
    alphabet.add(new Character('E'));
    alphabet.add(new Character('F'));
    alphabet.add(new Character('G'));
    alphabet.add(new Character('H'));
    alphabet.add(new Character('I'));
    alphabet.add(new Character('J'));
    alphabet.add(new Character('K'));
    alphabet.add(new Character('L'));
    alphabet.add(new Character('M'));
    alphabet.add(new Character('N'));
    alphabet.add(new Character('O'));
    alphabet.add(new Character('P'));
    alphabet.add(new Character('Q'));
    alphabet.add(new Character('R'));
    alphabet.add(new Character('S'));
    alphabet.add(new Character('T'));
    alphabet.add(new Character('U'));
    alphabet.add(new Character('V'));
    alphabet.add(new Character('W'));
    alphabet.add(new Character('X'));
    alphabet.add(new Character('Y'));
    alphabet.add(new Character('Z'));
    
    for(int i = 0; i < sb.length(); i++)
    {
    
    Character c = new Character(sb.charAt(i));
    
    if(alphabet.contains(c))
    {
    
    int v = (alphabet.indexOf(c) + r) % sb.length();
    Character ch = (Character)alphabet.get(v);
    sb.setCharAt(i, ch.charValue());
    
    }
    
    }
    
    return sb.toString();
    
    }
    

    Beim kompilieren bekomme ich dann diese Fehlermeldung:
    Note: D:\Programmieren\Java\Pool\Krypto\KryptUtility.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    p.s. Bitte nicht zu hart mit mir sein, habe seit einem halben Jahr nichts mehr mit Java gemacht und bin etwas ausser Übung.



  • Hallo,

    ich hab zwar schon lange nichts mehr in Java gemacht, hier also nur eine Ideee ohne Code:

    Du kannst doch sicher jeden Buchstaben in seinen ASCII Code umwandeln. Diesen brauchst du dann nur noch um 3 zu erhöhen (achte dabei natürlich auf x,y,z die müssten extra behandelt werden). Anschliessend den ASCII Code wieder zurück in einen char ... fertig.

    Wenn mich nicht alles täuscht sollte die Konvertierung etwa so funktionieren

    int iAscii = (int)'a';
    

    Viel Erfolg
    Tobi



  • Hm, das wäre natürlich ne bedenkenswerte Idee.
    Wäre trotzdem toll wenn jemand nen Tipp hätte, warum der Compiler an meinem Code rummeckert.

    Gruß Michamab



  • Versuch mal so zu compilieren:

    javac -Xlint:unchecked KryptUtility.java
    

    so sollten mehr infos zu sehen sein.



  • Das hat mir leider auch nicht weitergeholfen, als Ausgabe bekomme ich für jeden add()-Vorgang jeweils diese Aussage:

    D:\Programmieren\Java\Pool\Krypto\KryptUtility.java:22: warning: [unchecked] unchecked call to add(int,E) as a member of the raw type java.util.ArrayList
    			alphabet.add(alphabet.size(), new Character('A'));
    

    Ich habe mit der add-Funktion auch noch ein wenig rumgespielt, z.B. versucht eine Exception abzufangen oder wie zu sehen noch den Index der Position anzugeben. at leider alles nicht geholfen. Wäre echt toll, wenn mir jemand eine Antwort geben könnte.



  • Welche Java version benutzt du? 1.5???

    ---Edit
    Hab's raus 😉
    Das ist nur eine Warnung dafür, dass du deine ArrayList nicht spezialisiert hast.
    D.H. dass du

    ArrayList<Character> alphabet = new ArrayList<Character>();
    

    schreiben musst um die Warnung weg zu machen. Diese Template-artigen Konstrukte gibt's erst seit Java 1.5.

    Übrigens hat das den Vorteil, dass du solche Sachen machen kannst:

    arrayList.add('a');
    ...
    

    Wenn du mehr darüber wissen willst, dann google mal nach Generics und Autoboxing.



  • Den Cäsar-Chiffre kann man auch einfacher (und schneller) realisieren,
    Kodiert den Inhalt von source in target rein und umgekehrt:

    private void encode(int r) {
      try {            
        DataInput source = new DataInputStream(new FileInputStream(sourcePath));
        DataOutput target = new DataOutputStream(new FileOutputStream(targetPath));
    
        while (true) {
          byte b = (byte)source.readByte();
    
          b = (byte)((b+r)%256);
          target.writeByte(b);
        }
      }
      catch (EOFException ex0) {}
      catch (IOException ex1) {}		
    }
    
    private void decode(int r) {
      try {
        DataInput source = new DataInputStream(new FileInputStream(sourcePath));
        DataOutput target = new DataOutputStream(new FileOutputStream(targetPath));
        while(true) {
          byte b = (byte)source.readByte();
          b = (byte)((b-r)%256);
          target.writeByte(b);
        }
      }
      catch (EOFException ex0) {}
      catch (IOException ex1) {}
    }
    


  • Super, jetzt funktioniert alles 🙂
    Danke für all die Hilfe und Vorschläge.


Anmelden zum Antworten