用户可以选择向左或向右移动字母,方法是选择左侧为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();
}
答案 0 :(得分:4)
在您的代码中,您在开始时将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;
}