Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用数组的凯撒密码_Java_Arrays_Caesar Cipher - Fatal编程技术网

Java 使用数组的凯撒密码

Java 使用数组的凯撒密码,java,arrays,caesar-cipher,Java,Arrays,Caesar Cipher,我的CompSci课程给了我一个作业,要求我们创建一个使用凯撒密码加密文本字符串的程序,但是现在我的代码做了一些有趣的事情,我遇到了麻烦 我首先创建一个包含字母表中每个字母的字符串数组。然后,我将用户输入的消息拆分为单词,然后再拆分为字母。然后,这些字母中的每一个都被放入一个名为字母的数组中。一旦有了字母数组,我就调用“getLetterIndex”函数 在getLetterIndex函数中,我有一个从I=0到I=25的外部for循环计数(25是字母表数组中的最后一个索引)和一个内部for循环,

我的CompSci课程给了我一个作业,要求我们创建一个使用凯撒密码加密文本字符串的程序,但是现在我的代码做了一些有趣的事情,我遇到了麻烦

我首先创建一个包含字母表中每个字母的字符串数组。然后,我将用户输入的消息拆分为单词,然后再拆分为字母。然后,这些字母中的每一个都被放入一个名为
字母
的数组中。一旦有了字母数组,我就调用“getLetterIndex”函数

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

我已经能够将每个字母转换成一个索引值,但是我的这些字母索引数组不知怎么地从最小到最大排序

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++;
            }
        }
    }
您可以在上面看到,每个字母都正确地转换为它在字母表中的位置,并且位置转换成功完成,但是由于某些原因索引出现了错误。“原始位置”应为:0 15 11 4

奇怪的是,当我输入字母表作为要加密的消息时,它工作得非常好:

输入“0”键入短语,或输入“1”指定文本文档的路径:0
输入要加密的消息。不要输入数值:abcdefghijklmnopqrstuvwxyz
输入要用于加密的密钥(整数):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
原始位置:01 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 19 20 21 22 24 25
换班后的位置:3 4 5 6 7 8 9 10 11 12 14 15 17 18 19 20 21 22 24 25 0 1 2
加密消息:
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相当陌生,有一种将简单问题过度复杂化的倾向,因此非常感谢您在这方面提供的任何帮助

您可能希望了解字符串的
tocharray()
(),以及
char
如何与一起使用。通过将列表中的每个字符串转换为字符数组,可以以数字方式操纵它们的值

在测试仪方法中加入以下内容:

char A = 'A';
A++;
System.out.println(A);
这将打印出字母“B”。现在想想如果你有字母“Z”并且它是递增的,会发生什么。你会想回到“A”

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'
}
charz='Z';
如果(Z<'Z'){
Z++;//如果我们还没有到达“Z”(并且只移动了1),则递增!
}否则{
Z='A';//否则,将其重置为'A'
}
此逻辑仅在字符移位1时有效。您需要对所有可能值
X
使用通用方法(假设
X
大于0)。这就是模
%
运算符派上用场的地方!您知道
X
只有26个可能的值,因此如果用户输入了一个更大的数字,如50,您只需要知道
50%26=24
,这将为您提供移位值
X


现在,您已经掌握了所有这些逻辑,请记住数组/列表保持其顺序,因此字符串列表中每个单词中字母的原始顺序将保持不变。

您只担心大写字母吗?我的字母表数组中的字母都是大写,因此,在调用
getletindex
之前,我将输入的消息转换为大写字母,以保持所有内容的一致性。