Caesar Cipher不打印最终阵列

时间:2016-05-07 16:07:23

标签: java arraylist caesar-cipher

我正在尝试用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);

}

}

1 个答案:

答案 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中的字母数。