Java的Caesar Cipher.编码,解码旋转字符串



嗨,我正在尝试制作一个程序,该程序允许用户编码,解码和旋转字符串。例如:

用户输入:"凯撒"系统输出:" FDHVDU"

用户可以决定要旋转该单词多少。该程序尚未完成,我只是为Option V:编码做了一种方法,想知道我是否合适?或者如果工作完全不同!

public class CaesarsChiffre {
    public static void main(String[] args) {
        char benutzerBefehl;
        String benutzerText;
        int rotation=0;

        System.out.println("Caesars Chiffre encode, decode, rotate.");
        System.out.println("Waehlen Sie:");
        System.out.println("V for encode");
        System.out.println("E for decode");
        System.out.println("B for rotation");
        benutzerBefehl=V; //Input.readChar();
        System.out.println("Enter text to encode:");
        benutzerText=Input.readString();
        System.out.println("which rotation do you want?");
        rotation=Input.readInt();
        switch (benutzerBefehl){ 
        case V: System.out.println(": Encoded text: "+Caesar.encode(benutzerText,rotation));
            break;
        case E: (": Decoded text: "+Ceasar.decode(benutzerText,rotation));
            break;
        case B: // will be filled
            break;
        default:
            System.out.println("Invalid option..");
        }
        public static String Caesar.encode(String original_text, int rot){
            String []s= original_text.split(" ");
            for(int i=0;i<s.length();i++){
                Stringbuilder letter=new StringBuilder();
                letter.append(s.[i]+rot);
            }
            return String;
        }


    }
}
        for(int i=0;i<s.length();i++){
            Stringbuilder letter=new StringBuilder();
            letter.append(s.[i]+rot);
        }

由于您创建(并解散)Stringbuilder对象使用迭代。

btw: letter是该变量的错误名称,因为它将包含 word (至少)不是一个字母...

您需要阅读有关OOP的一些内容,因为您将所有内容都放在一种方法上,这不是Java方式。当您继续以这种方式编写代码时,您将遭受痛苦,并浪费大量时间试图调试和了解发生了什么。在解决任务的第一点是思考时,编写代码是最后一点。首先,我们需要分解任务。Caesar Cypher即将将句子中的每个字母从初始点转移到新位置。因此,我们将创建班级字母和 tell 此字母类以向右或向左移动。

public class Main {
    public static void main(String[] args) {
        String word = "Caesar";
        String expected = "Fdhvdu";
        String result = word.chars()
                .mapToObj(character -> new Letter((char) character))
                .map(letter -> letter.shiftRightTo(3))
                .map(letter -> letter.toString())
                .collect(Collectors.joining());
        System.out.println(result.equals(expected));
        System.out.println(result);
    }
}

class Letter {
    private final String alphabet = "abcdefghijklmnopqrstuvwxyz";
    private final boolean isLowerCase;
    private final char letter;
    public Letter(char letter) {
        this.isLowerCase = Character.isLowerCase(letter);
        this.letter = Character.toLowerCase(letter);
    }
    Letter shiftRightTo(final int shift) {
        int letterPosition = alphabet.indexOf(letter);
        for (int i = 0; i < shift; i++) {
            letterPosition++;
            if (letterPosition == alphabet.length()) {
                letterPosition = 0;
            }
        }
        char shiftedLetter = alphabet.charAt(letterPosition);
        return new Letter(isLowerCase ? shiftedLetter : Character.toUpperCase(shiftedLetter));
    }
    Letter shiftLeftTo(final int shift) {
        int letterPosition = alphabet.indexOf(letter);
        for (int i = 0; i < shift; i++) {
            letterPosition--;
            if (letterPosition == -1) {
                letterPosition = alphabet.length() - 1;
            }
        }
        char shiftedLetter = alphabet.charAt(letterPosition);
        return new Letter(isLowerCase ? shiftedLetter : Character.toUpperCase(shiftedLetter));
    }
    public String toString() {
        char result = isLowerCase ? letter : Character.toUpperCase(letter);
        return Character.toString(result);
    }
}

此代码有效,但需要重构以删除代码重复。您可以进一步改进它,以介绍另一个称呼字母类的词和隐藏字母类别的班级。

最新更新