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