gpt4 book ai didi

java - 改变 Java 中凯撒移位的方向

转载 作者:行者123 更新时间:2023-12-01 18:15:30 25 4
gpt4 key购买 nike

用户可以通过选择 1 向左或 2 向右来选择向左或向右移动字母。左边工作正常,右边不行。现在它显示了完全相同的循环,但我已经用不同的方式更改了所有 +- 符号,但最终总是得到奇怪的字符。如何让程序将字符向相反方向移动?如果用户输入 Hi,且移位值为 1 并且方向为右,则 H 应变为 G,而 i 应变为 k,因为移位量应在每个字母之前增加 shiftValue。另外,目前第一个字母没有改变,这不应该是这样的。

public static String rotate(String userString, int shiftValue, int shiftDirection) {
int myShift = 0;
shiftValue = shiftValue % 26 + 26;
StringBuilder encoded = new StringBuilder();
if (shiftDirection == 1) {
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift + shiftValue) % 26;
}
} else if (shiftDirection == 2) {
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift - shiftValue) % 26;
}
}

return encoded.toString();
}

最佳答案

在您的代码中,您在开始时将 myShift 设置为 0,并且在移动第一个字母时没有更改它。这就是为什么你的第一封信没有改变。

如果您要向前移动,请在实际旋转之前执行此操作:

int myShift = shiftValue % 26 + 26;
<小时/>

我已经在您上一个问题中回答了您的问题,Rotating a shift each time a letter is read .

您可以为 rotate 方法使用重载方法。

public static String rotate(String userString, int shiftValue, int shiftDirection) {
if (shiftDirection == 1) {
return rotate(userString, shiftValue);
}
else if (shiftDirection == 2) {
return rotate(userString, -shiftValue);
}
else {
return "This is not a valid way to shift your message.";
}
}

另一个rotate方法是重复的代码:

public static String rotate(String userString, int shiftValue) {
StringBuilder encoded = new StringBuilder();
int myShift = shiftValue % 26 + 26;
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26 ));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26 ));
}
} else {
encoded.append(i);
}
myShift = (myShift + shiftValue) % 26;
}
return encoded.toString();
}

请注意,这两个方法具有相同的名称,但它们采用不同的参数。当你调用该方法时,使用这个方法。然后,您可以指定要以哪种方式转移消息,而不必担心更改重复代码中的符号。

还有另外两种方法可以实现此目的。

<小时/>

首先,当shiftDirection == 2时,您应该替换

encoded.append((char) ('A' + (i - 'A' + myShift) % 26));

encoded.append((char) ('A' + (i - 'A' - myShift) % 26));

所以当 shiftDirection == 2 时的最终结果应该是

for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' - myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' - myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift + shiftValue) % 26;
}
<小时/>

其次,您可以通过在开始时将 myShift 设置为 -shiftValue 来向后移动方向,并保持其他所有内容相同。当 shiftDirection == 2 时的完整代码应该是

myShift = -shiftValue;
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift - shiftValue) % 26;
}

关于java - 改变 Java 中凯撒移位的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829396/

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