替换消息中的字符

时间:2015-06-21 00:04:46

标签: java

所以,基本上我试图替换将由用户输入的消息中的所有字符。例如,如果用户输入" dog"并输入代码编号" 4",然后新消息将是" hsk"。 d, e,f,g,h ,与o相同, p,q,r,s 。这是我的代码:

import java.util.*;

public class Lab6 {
    public static void main(String[] args) {

    int codeNum;
    String msg;

    Scanner in = new Scanner(System.in);
    Scanner read = new Scanner(System.in);

    System.out.println("Please enter a message");
    msg = read.nextLine();
    System.out.println("Please enter a value for coding");
    codeNum = in.nextInt();

    System.out.println("New message = " + getMsg(msg, codeNum));

    }

    public static String getMsg(String msg, int codeNum) {

    char[] Upper_Case_Array = {'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'};
    char[] Lower_Case_Array = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'l', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    char[] digArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    char[] charArray = msg.toCharArray();


    for (int i = 0; i <= charArray.length; i++) {
        if (charArray[i] == ' ') {
            continue;
        }
        for (int j = 0; j <= Upper_Case_Array.length; j++) {
            if (charArray[i] == Upper_Case_Array[j]) {
                charArray[i] = Upper_Case_Array[j + codeNum];
            }
        }
        for (int h = 0; h <= Lower_Case_Array.length; h++) {
            if (charArray[i] == Lower_Case_Array[h]) {
                charArray[i] = Lower_Case_Array[h + codeNum];
            }
        }

        for (int u = 0; u <= digArray.length; u++) {
            if (charArray[i] == digArray[u]) {
                charArray[i] = digArray[u + codeNum];
            }
        }

    }
    return new String(charArray);
    }
}

它确实要求用户输入消息和代码编号,但之后我得到了

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 26 at Lab6.getMsg(Lab6.java:39) at Lab6.main(Lab6.java:22)

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

听起来我觉得这是一个边界问题。所以在这种情况下你应该做的是小心数组的边界。好吧,显然你的代码中有这些行:

charArray[i] = Upper_Case_Array[j + codeNum];

charArray[i] = Lower_Case_Array[h + codeNum];

charArray[i] = digArray[u + codeNum];

让我们考虑最后一个例子。所以,你24岁就会造成麻烦,因为24 + 4是28,大于26(由于英文字母中的26个字母,我没有计算你的数组,但只是假设)。您可能必须为每个for循环提供明确的控制,以免以这种方式发生。

但我会建议你,反过来说,字符是整数,所以只需将整数值(codeNum)添加到你拥有的字符中,只需执行该操作即可拥有新字符。我不知道是否有规则你不能利用它,但它必须得到解决。所以具体来说,你可能想要使用那一行:

chararray[i] = charArray[i] + 4;

希望它有所帮助。

答案 1 :(得分:0)

如果此代码

,请替换您的getMsg()方法
public static String getMsg(String msg, int codeNum) {

            char[] Upper_Case_Array = {'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'};
            char[] Lower_Case_Array = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'l', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
            char[] digArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
            char[] charArray = msg.toCharArray();

            for (int i=0; i<charArray.length; i++) {
                int newIndex = 0;
                if (getIndex(Upper_Case_Array, charArray[i]) != -1) {
                    newIndex = i + codeNum;
                    if (newIndex >= Upper_Case_Array.length) {
                        newIndex = newIndex - Upper_Case_Array.length ;
                    }
                    charArray[i] = Upper_Case_Array[newIndex];
                } else if (getIndex(Lower_Case_Array, charArray[i]) != -1) {
                    newIndex = i + codeNum;
                    if (newIndex >= Lower_Case_Array.length) {
                        newIndex = newIndex - Lower_Case_Array.length ;
                    }
                    charArray[i] = Lower_Case_Array[newIndex];
                } else if (getIndex(digArray, charArray[i]) != -1) {
                    newIndex = i + codeNum;
                    if (newIndex >= digArray.length) {
                        newIndex = newIndex - digArray.length ;
                    }
                    charArray[i] = digArray[newIndex];
                }       
            }

            return new String(charArray);
        }

        public static int getIndex(char[] source, char filter) {
            int result = -1;
            for (int i=0; i<source.length; i++) {
                if (source[i] == filter) {
                    result = i;
                    break;
                }
            }
            return result;
        }

答案 2 :(得分:0)

如果您了解输入的ASCII代码:

'0' - '9' = 48 - 57
'A' - 'Z' = 65 - 90
'a' - 'z' = 97 - 122
// All other characters are not affected by the code number

然后您就会知道在将代码编号添加到角色的ASCII值后,您可以传递最大值&#39; 9&#39;,&#39; Z&#39;或者&#39; Z&#39;你想要重新开始回到&#39; 0&#39; A&#39; A&#39;或&#39; a&#39;。

如果你知道这一点,那么你可以简单地使用getMsg(),而不必担心有大写,小写或数字的数组;你不必做很多循环。如下所示:

public static void main(String[] args) throws Exception {
    Scanner input = new Scanner(System.in);

    System.out.print("Please enter a message: ");
    String message = input.nextLine();
    System.out.print("Please enter a value for coding: ");
    int codeNumber = input.nextInt();

    System.out.println(getMsg(message, codeNumber));
}

public static String getMsg(String message, int codeNumber) {
    char[] characters = message.toCharArray();

    for (int i = 0; i < characters.length; i++) {
        for (int j = 0; j < codeNumber; j++) {
            int charCode = characters[i] + 1;
            // Only apply the modification to letters or numbers
            if (Character.isUpperCase(characters[i])) {
                characters[i] = charCode > 'Z' ? 'A' : (char)charCode;
            } else if (Character.isLowerCase(characters[i])) {
                characters[i] = charCode > 'z' ? 'a' : (char)charCode;
            } else if (Character.isDigit(characters[i])) {
                characters[i] = charCode > '9' ? '0': (char)charCode;
            }
        } 
    }  
    return new String(characters);
}

结果:

Please enter a message: dog zebra 7890
Please enter a value for coding: 4
hsk difve 1234