我正在尝试用Java创建一个Caesar密码,它会询问你想要移动哪个单词以及多少单词。我得到了一个超出范围的例外,但这是固定的,它仍然无法正常工作
这是我的代码:
package cipher;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class mycipher {
public static void main(String[] args) {
ArrayList<Character> finalpro = new ArrayList<Character>();
ArrayList<Integer> modlet = new ArrayList<Integer>();
Scanner consolereader= new Scanner(System.in);
ArrayList<Character> letters = new ArrayList<Character>();
char[] letters2 = {'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'};
for(int i=0; i<letters2.length; i++){
letters.add(letters2[i]);
}
System.out.println("what word would you like to cipher?");
String original = consolereader.nextLine();
System.out.println("how much would you like to shift it by");
int shift = consolereader.nextInt();
ArrayList<Character> userword = new ArrayList<Character>();
for(int i=0; i<original.length();i++){
userword.add(original.charAt(i));
}
for(int i=0; i<userword.size(); i++){
if(userword.get(i)==letters2[i]){
modlet.add(i%shift);
}
}
for(int i=0;i<modlet.size(); i++){
finalpro.add(letters2[modlet.get(i)]);
}
System.out.println(finalpro);
}
}
答案 0 :(得分:1)
在:
for(int i=0; i<letters.size(); i++){
if(userword.get(i)==letters2[i]){
modlet.add(i%shift);
}
}
您正在迭代使用可能比userword ArrayList更大的letters.size()。当你执行userword.get(i)时,索引将大于userword.size(),因此outOfBoundsException。
您应该尝试更改字符的ascii代码(对于小写字母):
for(Character charWord : userword){
charWord = (char)(((((int) charWord - 97) + shift)%26) + 97);
}
这应该替换用户名中的字符,其中字符移动了&#34; shift&#34;。
97 - &gt; ascii代码&#34; a&#34;
26 - &gt; alphabeth中的字母数。