Caesar Cipher使用数组

时间:2018-04-28 02:25:47

标签: java arrays caesar-cipher

我已经为我的CompSci类分配了一个任务,我们需要创建一个使用Caesar Cipher加密一串文本的程序,但是现在我的代码正在做一些有趣的事情

我首先创建了一个包含字母表中每个字母的字符串数组。然后我接收用户输入的消息,将其分成单词,然后分成字母。然后将每个字母放入一个名为letters的数组中。一旦我有了我的字母数组,我就调用'getLetterIndex`函数。

getLetterIndex函数中,我有一个从i = 0i = 25的外部for循环计数(25是字母数组中的最后一个索引)和一个内部for循环迭代虽然数组letters中的每个字母。如果alphabet[i]等于letters数组中的字母,则i的值将添加到名为letterIndexes的数组中。因此,每个字母都会转换为字母表中放置位置的数字表示。

我已经能够将每个字母转换为索引值,但我的这些字母索引的数组以某种方式从最小到最大排序。

static String[] alphabet = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
                            "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};


public static void tokenizeEnteredMessage(String message) {
    String[] words = message.split(" ");
    String[] letters = null;
    for (String word : words) {
        letters = word.toUpperCase().split("");
    }                     
    getLetterIndex(letters);
}


public static void getLetterIndex(String[] letters) {
    int indexCount = 0;
    int[] letterIndexes = new int[letters.length];
    for (int i = 0; i < alphabet.length; i++) {
        for (String letter : letters) {
            if (alphabet[i].equals(letter)) {
                letterIndexes[indexCount] = i;
                indexCount++;
            }
        }
    }

输出消息“apple”并且密码移位为3:

Enter '0' to type a phrase or enter '1' to specify the path to a text document: 0
Enter message that you would like to have encrypted. Do not enter numerical values: apple

Enter the key you would like to use to encrypt (integer): 3

A P P L E 
   Original Position: 0 4 11 15 15 
Position After Shift: 3 7 14 18 18 

Encrypted Message:
D H O S S

您可以看到上面的每个字母都正确地转换为它在字母表中的位置并且位置转换已成功完成,但由于某种原因索引无序。 “原始位置”应为:0 15 15 11 4。

奇怪的是,当我输入字母作为我要加密的信息时,它完全正常:

Enter '0' to type a phrase or enter '1' to specify the path to a text document: 0
Enter message that you would like to have encrypted. Do not enter numerical values: abcdefghijklmnopqrstuvwxyz

Enter the key you would like to use to encrypt (integer): 3

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
   Original Position: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
Position After Shift: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0 1 2 

Encrypted Message:
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

我还应该提一下,我的教授要求我们不要使用任何子串方法,而是坚持只使用数组作为赋值要求的一部分。 我确信这是一个我忽略的简单错误,但我似乎无法抓住它。我对Java很新,并且倾向于使简单问题过于复杂,所以对此有任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

您可能希望查看字符串toCharArray()String's Java Doc)以及char如何与ASCII values一起使用。通过将列表中的每个字符串转换为字符数组,您可以在数字上操作它们的值。

将以下内容投入测试方法:

char A = 'A';
A++;
System.out.println(A);

这将打印出字母&#39; B&#39;。现在想想如果你有这封信&#39; Z&#39;并且它递增了。你会想回到A&#39;。

char Z = 'Z';

if(Z < 'Z') {
   Z++; // If we haven't reached 'Z' (and are only shifting by 1), increment away!
} else {
   Z = 'A'; // Otherwise, reset it to 'A'
}

此逻辑仅在将字符移动1时有效。您需要所有可能值X的通用方法(假设X大于0 )。那个模%运算符就派上用场了!您知道X只有26个可能的值,因此如果用户输入的数字较大,如50,您只需要知道50%26 = 24,这会为您提供移位值X

既然您拥有所有这些逻辑,请记住数组/列表保持其顺序,因此字符串列表中每个单词中字母的原始顺序将保持不变。