改变Java中凯撒移位的方向

用户可以选择向左或向右移动字母,方法是选择左边的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; 

我已经在您之前的问题中回答了您的问题, 每次阅读一封信都要轮换一个class次 。

您可以为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; } 

其次,你可以通过在开始时将-shiftValue设置为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; }