在Java

时间:2015-04-23 16:30:16

标签: java

用户可以选择向左或向右移动字母,方法是选择左侧为1或右侧为2。左边工作正常,右边不是。现在它显示完全相同的循环,但我玩过以不同的方式更改所有+-标志,我总是得到奇怪的字符。如何让程序在相反的方向上移动字符?如果用户键入Hi,并且班次值为1且方向正确,则H应变为Gi应变为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();
}

1 个答案:

答案 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;
    }