所以,基本上我试图替换将由用户输入的消息中的所有字符。例如,如果用户输入" 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)
我该如何解决这个问题?
答案 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