caesar密码的java实现

44u64gxh  于 2021-07-11  发布在  Java
关注(0)|答案(3)|浏览(456)

我必须实现一个名为 encodeCaesar 在班上 Functionality.java ,它使用caesar加密对文本进行编码,我对java完全是个新手。
签名: encodeCaesar(String s, int val) : String 该方法获取一个字符串值和一个整数值作为输入参数。字符串值中的字母(字符)将被整数值移位。为了简单起见,我可以假设只有字母,没有空格、数字或特殊字符。
在执行加密之前,应将字符串值转换为小写。该方法应返回一个字符串,其中每个字母都已根据指定的整数值移动。
例子: encodeCaesar("Ac",3) 退货 "df" . 如果给定的整数值小于0或大于26,则应返回空字符串。

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

    public static String encodeCaesar(String s, int val) {
        char[] newString = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
            int newChar = newString[i] + val + 26;

            // Handle uppercase letters
            while (Character.isUpperCase(newString[i]) && newChar >= 65 + 26) {
                newChar -= 26;
            }

            // Handle lowecase letters
            while (Character.isLowerCase(newString[i]) && newChar >= 97 + 26) {
                newChar -= 26;
            }

            newString[i] = (char) (newChar);
        }

        return String.valueOf(newString);
    }
}

我的问题是,作为回报,它只给了我真假。如何解决这个问题:该方法应该返回一个字符串,其中每个字符都按照指定的整数值进行了移动。

qacovj5a

qacovj5a1#

以下代码片段解决了一些小问题:
密码保持非字母字符(如果有)不变 while 循环替换为 if 使用模运算符将值覆盖 z ```
public static String encodeCaesar(String s, int val) {
char[] newString = s.toLowerCase().toCharArray();
for (int i = 0; i < newString.length; i++) {
char newChar = newString[i];

    if (newChar >= 'a' && newChar <= 'z') {
        newString[i] = (char) ('a' + (newChar + val - 'a') % 26); 
    }
}

return new String(newString); // String.valueOf calls it anyway

}

比较:

System.out.println("encode: " + encodeCaesar("Viva Caesar! Morituri te salutant!", 3));
System.out.println("caesar: " + caesar("Viva Caesar! Morituri te salutant!", 3));

输出:

encode: ylyd fdhvdu! prulwxul wh vdoxwdqw!
caesar: ylyd=fdhvdu>=prulwxul=wh=vdoxwdqw>

ctzwtxfj

ctzwtxfj2#

public static String caesar(String s, int val) {
    char[] newString = s.toLowerCase().toCharArray();
    for (int i = 0; i < s.length(); i++) {
        int newChar = newString[i] + val + 26;
        // Handle lowercase letters
        while (Character.isLowerCase(newString[i]) && newChar >= 97 + 26) {
            newChar -= 26;
        }
        newString[i] = (char) (newChar);
    }
    return String.valueOf(newString);
}

我解决了这个问题。

cygmwpex

cygmwpex3#

你可以用 String.codePoints 方法进行迭代 int 此字符串的字符值,并按给定值移动它们:

public static String encodeCaesar(String s, int val) {
    if (val < 0 || val > 26) return "";
    return s.codePoints()
            // Stream<Character>
            .mapToObj(i -> (char) i)
            // convert to lowercase
            .map(Character::toLowerCase)
            // filter out non-letters
            .filter(ch -> ch >= 'a' && ch <= 'z')
            // if a letter should be shifted
            // outside the alphabetical range,
            // then move it before the beginning
            .map(ch -> ch + val > 'z' ? ch - 'z' + 'a' - 1 : ch)
            // shift letter by a given value
            .map(ch -> ch + val)
            // each character as a single string
            .map(Character::toString)
            // join characters into one string
            .collect(Collectors.joining());
}
public static void main(String[] args) {
    System.out.println(encodeCaesar("Ac", 3)); // df
    System.out.println(encodeCaesar("YZx 32*d", 3)); // bcag
}

另请参见:替换字符串中的非ascii字符

相关问题