Java中的凯撒密码。编码,解码旋转字符串

时间:2017-12-06 09:37:39

标签: java

嗨,我正在尝试制作一个程序,允许用户对String进行编码,解码和旋转。例如:

用户输入:" Caesar" 系统输出:" Fdhvdu"

用户可以决定要旋转多少字。该程序还没有完成,我只是为选项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;

        }




    }

}

2 个答案:

答案 0 :(得分:0)

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

由于您使用循环的每次迭代创建(并忽略)Stringbuilder对象,因此该循环不起作用。

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

答案 1 :(得分:0)

你需要阅读有关oop的内容,因为你把所有内容都放在一个方法中,这不是java方式。当您继续以这种方式编写代码时,您将遭受损失并浪费大量时间来尝试调试并了解正在发生的事情。在解决任务时,第一点是思考,编写代码是最后一点。首先我们需要分解任务。 Caesar cypher即将把句子中的每个字母从初始点移到新位置。因此,我们将创建课程信函并告诉这个Letter课程将自己转移到右侧或左侧。

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);
    }
}

此代码有效,但需要重构才能删除代码重复。您可以进一步改进它以引入另一个调用Word并隐藏其后面的Letter类的类。