Java 改变爪哇凯撒式转变的方向
用户可以选择向左或向右移动字母,向左选择1,向右选择2。左边工作正常,右边不行。现在它显示的是完全相同的循环,但我用不同的方式改变了所有的Java 改变爪哇凯撒式转变的方向,java,Java,用户可以选择向左或向右移动字母,向左选择1,向右选择2。左边工作正常,右边不行。现在它显示的是完全相同的循环,但我用不同的方式改变了所有的+和-符号,结果总是得到奇怪的字符。如何让程序将字符向相反方向移动?如果用户键入Hi,且移位值为一且方向正确,则H应变为G,i应变为k,因为每个字母前的移位量应增加shiftValue。此外,第一个字母目前没有改变,情况不应该如此 public static String rotate(String userString, int shiftValue, in
+
和-
符号,结果总是得到奇怪的字符。如何让程序将字符向相反方向移动?如果用户键入Hi
,且移位值为一且方向正确,则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;
我已经在你之前的问题中回答了你的问题 您可以对
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));
与
因此,当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;
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
时的完整代码应为
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;
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
设置为0,并且在移动第一个字母时未对其进行更改。这就是为什么你的第一个字母是不变的
如果要向前换档,请在实际旋转之前执行此操作:
int myShift = shiftValue % 26 + 26;
我已经在你之前的问题中回答了你的问题 您可以对
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));
与
因此,当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;
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
时的完整代码应为
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;
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;
}
向后移动1与向前移动25是相同的,我将如何实现这一点?谢谢我们的观点是一样的:你知道你在这里实现的并不完全是凯撒密码,对吧?在凯撒密码中,所有字符的移位都是相同的。这里有一个维格纳密码的特例。(我不知道它是否有自己的名字。)另外,你确定
Hi
应该变成Gk
?这将需要将第一个字母向左移动1,将第二个字母向右移动2。你的意思是说Ik
?有趣的是,我不知道轮班的区别。但是,是的,我正在使用的移位我希望更难打破,因此如果用户选择2的移位,它应该旋转两个位置,使H
aJ
,然后在加密I
之前再旋转两个位置,这样它就变成了m
。我知道这不是很传统,但我希望在加密每个新字母之前,用户选择旋转字母表中的许多字符。有人知道如何让它转向另一个方向吗?向后移动1等于向前移动25我该如何实现?谢谢我们的观点是一样的:你知道你在这里实现的并不完全是凯撒密码,对吧?在凯撒密码中,所有字符的移位都是相同的。这里有一个维格纳密码的特例。(我不知道它是否有自己的名字。)另外,你确定Hi
应该变成Gk
?这将需要将第一个字母向左移动1,将第二个字母向右移动2。你的意思是说Ik
?有趣的是,我不知道轮班的区别。但是,是的,我正在使用的移位我希望更难打破,因此如果用户选择2的移位,它应该旋转两个位置,使H
aJ
,然后在加密I
之前再旋转两个位置,这样它就变成了m
。我知道这不是很传统,但我希望在加密每个新字母之前,用户选择旋转字母表中的许多字符。有人知道如何让它转向另一个方向吗?做任何一个这样的操作都会给我这样的输出:@@@@@@@@!>>>>>?绝对不是我所期望的。知道为什么旋转这个方向会产生这些符号吗?非常感谢您的帮助和解释!你用什么来表示用户字符串?我注意到有几个字母出来很有趣。。。通过使用intmyshift=shiftValue%26+26代码>而不是int myShift=shiftValue%26但是我没有得到这么奇怪的结果。你说你读过