我需要构建一个凯撒密码,它只加密字母,但不加密特殊字符。我的概念是,将输入的char[]与两个字母表的char[]进行比较。如果一个字符中没有匹配项,则应将该字符添加到字符串中而不进行更改。问题是,在for循环结束之前,未更改的字符将被添加到String中。我该如何解决这个问题?
public static String encrypt(String text, int number) {
String str = "";
char[] chars = text.toCharArray();
char[] al = "abcdefghijklmnopqrstuvwxyz".toCharArray();
char[] ab = "abcdefghijklmnopqrstuvwxyz".toUpperCase().toCharArray();
for (char c : chars) {
boolean match = false;
for (int i = 1; i < chars.length - 1; i++) {
for (int k = 0; (k < al.length || k < ab.length) && !match; k++) {
match = (c == al[k] || c == ab[k]);
if (match) {
c += number;
str += c;
}
}
if (!match) {
str += c;
}
}
}
return str;
}
我已经尝试过将不更改字符串的情况放在另一个for循环中,但它将被添加,直到for循环结束。
我会通过遍历字符串并考虑每个字母的可能情况来解决这个问题
-
大写字母
-
小写字母
-
特殊字符
public static String encrypt(String text, int number) { //String to hold our return value String toReturn = ""; //Iterate across the string at each character for (char c : text.toCharArray()){ if (Character.isUpperCase(c)){ /* If uppercase, add number to the character If the character plus number is more than 90, subtract 25 [uppercase letters have ASCII 65 to 90] */ toReturn += c + number > 90 ? (char)(c + number - 25) : (char)(c + number); } else if (Character.isLowerCase(c)){ /* If lowercase, add number to the character If the character plus number is more than 122, subtract 25 [uppercase letters have ASCII 97 to 122] */ toReturn += c + number > 122 ? (char)(c + number - 25) : (char)(c + number); } else { // For other characters, just add it onto the return string toReturn += c; } } return toReturn; }
代码解释
你可能想知道的以下代码是什么
toReturn += c + number > 90 ? (char)(c + number - 25) : (char)(c + number)
结构为
toReturn += CONDITION ? A : B
它基本上读作
IF CONDITION IS TRUE, toReturn += A, ELSE toReturn += B
CONDITION
只是c + number > 90
,因为我们想确保我们只使用大写字母
当这是真的(A
(时,我们从c + number
中减去25
,否则(B
(我们将其保持为c + number
(B(
然后,我们将该值转换为char
,因为它最初是int