凯撒密码通过比较char数组和两个数组



我需要构建一个凯撒密码,它只加密字母,但不加密特殊字符。我的概念是,将输入的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

相关内容

  • 没有找到相关文章

最新更新