Java 改变爪哇凯撒式转变的方向

Java 改变爪哇凯撒式转变的方向,java,Java,用户可以选择向左或向右移动字母,向左选择1,向右选择2。左边工作正常,右边不行。现在它显示的是完全相同的循环,但我用不同的方式改变了所有的+和-符号,结果总是得到奇怪的字符。如何让程序将字符向相反方向移动?如果用户键入Hi,且移位值为一且方向正确,则H应变为G,i应变为k,因为每个字母前的移位量应增加shiftValue。此外,第一个字母目前没有改变,情况不应该如此 public static String rotate(String userString, int shiftValue, in

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