Caesar Cipher java我的方式,不起作用

时间:2015-04-09 19:11:52

标签: java

我知道有很多关于Caesar Cipher的话题,但我喜欢用自己的方式解决问题。 因此它不起作用,但我认为在一些帮助下我可能会按照自己的方式工作。我相信当你独自解决问题时,你们都会感受到良好的感觉。

所以这是我的想法。 制作包含字母表的字符数组。 和带有代码消息的字符串。 2 for循环。一个外部来设置来自消息的字符, 和通过字母数组扫描的内部。 当来自消息的信件在数组中遇到char时,它将数字替换为第3个(键3)char。

这是现在编写的一段代码:

    char[] alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'o', 'p','r','s','t','u', 'v', 'z'};

    String message = " This is message for coding";

    message = message.toLowerCase();
    String codedMsg = ""; 


    for(int i = 0; i < message.length(); i++)
    {

        for(int j =0; j < alphabet.length; j++)
        {
            if(message.charAt(i) == alphabet[j])
            {
    codedMsg += alphabet[j +3 ];

它符合要求,但在运行时收到以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 23
        at sifra.main(sifra.java:19)

4 个答案:

答案 0 :(得分:2)

alphabet[j + 3]超出了数组alphabet的大小。

答案 1 :(得分:2)

你的问题是你有alphabet[j + 3]。 但是因为j < alphabet.length,所以当j = alphabet.length - 2alphabet[j + 3]变成alphabet[alphabet.length + 1]时,你就会离开数组。

要解决此问题,您可以使用alphabet[(j + 3)%alphabet.length]

现在您的代码会运行但不正确。

因为你总是操纵message,所以它会在内循环中被多次替换。

for(int j =0; j < alphabet.length; j++)
        {
            if(message.charAt(i) == alphabet[j])
            {
                message = message.replace(message.charAt(i), alphabet[j + 3]); // THIS LINE IS THE PROBLEM

如果我们说message.charAt(i) = a这将是真的if(message.charAt(i) == alphabet[j])并且sting中的所有a将更改为d所以现在message.charAt(i) = d并且在3次迭代后如果for(int j =0; j < alphabet.length; j++) if语句将再次为真,则字符串中的所有d将替换为g,依此类推。我对此问题的解决方案如下,但可能还有更多:

     char[] alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'o', 'p','r','s','t','u', 'v', 'z'};

        String message = " This is message for coding";

        message = message.toLowerCase();
        char[] messageArray = message.toCharArray();

        for(int i = 0; i < message.length(); i++)
        {
            for(int j =0; j < alphabet.length; j++)
            {
                if(message.charAt(i) == alphabet[j]){
                    messageArray[i] = alphabet[(j + 3)%alphabet.length];
                }
            }
        }
        System.out.println(String.copyValueOf(messageArray));

答案 2 :(得分:1)

如评论中所述,问题是alphabet[j + 3]超出j的范围,大于或等于alphabet.length - 3。我可以建议的解决方案是将alphabet[j + 3]更改为alphabet[(j + 3) % alphabet.length],一旦索引超出范围,它将具有“循环”行为。

答案 3 :(得分:0)

正如其他人所指出的那样,你的问题是alphabet[j+3]将超出字母表的末尾。这是解决问题的解决办法。

替换此

message = message.replace(message.charAt(i), alphabet[j + 3]);

有了这个

if(j < alphabet.length - 3){
    message = message.replace(message.charAt(i), alphabet[j + 3]);
}else{
message = message.replace(message.charAt(i), alphabet[j + 3 - alphabet.length]);
}

如果它接近结尾,这应该将字母表循环回到开头。例如,如果输入了字符z,则会输出c