gpt4 book ai didi

java - 如何使用另一个字符串中的字符替换字符串中的字符(Caesar Cypher)(JAVA)

转载 作者:行者123 更新时间:2023-11-30 06:35:18 25 4
gpt4 key购买 nike

我正在做一个凯撒密码。尝试将字符串中的所有字符替换为移位字母表中的某个字符。

这是我到目前为止的代码

   public static String caesarify(String str, int key){
String alphabetNormal = shiftAlphabet(0);
String alphabetShifted = shiftAlphabet(key);
for (int i =0; i < str.length();i++){
for (int c =0; c < alphabetNormal.length(); c++) {
if (str.charAt(i) == alphabetNormal.charAt(c)) {
char replacement = alphabetShifted.charAt(c);
str.replace(str.charAt(i), replacement);
}
}
}
return str;
}

public static String shiftAlphabet(int shift) {
int start =0;
if (shift < 0) {
start = (int) 'Z' + shift + 1;
} else {
start = 'A' + shift;
}
String result = "";
char currChar = (char) start;
for(; currChar <= 'Z'; ++currChar) {
result = result + currChar;
}
if(result.length() < 26) {
for(currChar = 'A'; result.length() < 26; ++currChar) {
result = result + currChar;
}
}
return result;
}

我不知道为什么“ILIKEDONUTS”等字符串在凯撒化后不会更改为“JMJLFEPOVUT”。

最佳答案

不要使用replace() ,或任何 replace方法,替换 String 中给定索引处的字符。这不起作用。你希望如此

str.replace(str.charAt(i), replacement);

将取代i str 的第 ' 个字符。正如另一个(现已删除)答案中指出的,str.replace不变 str本身,所以你需要写

str = str.replace(str.charAt(i), replacement);

但这不起作用。 replace()方法不知道你的索引 i是。它只知道要替换什么字符。并且,如javadoc对于 replace()也就是说,它会替换字符串中的所有个字符。所以假设str.charAt(i)'a' ,并且您想将其替换为 'd' 。此代码将替换全部 a带有 d 的字符,包括 (1) 那些您已替换为 a 的内容在循环的早期,这样就会破坏你已经完成的工作;和 (2) a此字符之后的字符,您希望将其替换为 d ,但这会失败,因为稍后在循环中您将看到 d并将其替换为 g .

所以你不能使用replace() 。有多种方法可以替换 i字符串的第 ' 个字符,包括使用 substring() :

str = str.substring(0, i) + replacement + str.substring(i + 1);

但是,如果您要替换每个字符,还有更好的方法。一是创建StringBuilder来自str ,使用StringBuildersetCharAt方法更改指定索引处的字符,然后转换 StringBuilder返回String在最后。您应该能够查看javadoc找出要使用的方法。

更多:进一步研究后,我明白为什么它返回全 A。这个内部循环有一个错误:

    for (int c =0; c < alphabetNormal.length(); c++) {
if (str.charAt(i) == alphabetNormal.charAt(c)) {
char replacement = alphabetShifted.charAt(c);
str.replace(str.charAt(i), replacement);
}
}

假设key为1,当前字符为'C'。你的内循环最终会找到CalphabetNormal ;它在 alphabetShifted 中找到相应的字符,即D ,并替换CD .

但随后又循环回来。alphabetNormal 中的下一个字符开始是 D ,它现在匹配new str.char(i) ,现在是 D ,因此再次将其更改为 E 。然后它循环回来,然后......你就得到了图片。

关于java - 如何使用另一个字符串中的字符替换字符串中的字符(Caesar Cypher)(JAVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45293381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com