每次读取一个字母时旋转一个班次

时间:2015-04-23 14:32:38

标签: java

嘿伙计们,我真的在努力搞清楚我程序的一部分。现在,它需要用户输入一个班次并转移加密。但是,当用户输入班次时,我希望程序每次都进一步移动。所以说传入的字符串只是单词The,移位值是1。 T将移动到U,然后H将移动到J,E移动到H.基本上,每次更改一个角色时,键都会移动到U.可以说,进一步向下旋转量。到目前为止,这是我提出的,它显然不是完全正确,但编译和移位字符,只是没有在每个字符后添加的移位。谢谢!

 public static String rotate(String userString, int shiftValue) {

        shiftValue = shiftValue % 26 + 26;
        StringBuilder encoded = new StringBuilder();
        for (char i : userUpper.toCharArray()) {
            if (Character.isLetter(i)) {
                if (Character.isUpperCase(i)) {
                    encoded.append((char) ('A' + (i - 'A' + shiftValue) % 26 ));
                } else {
                    encoded.append((char) ('a' + (i - 'a' + shiftValue) % 26 ));
                }
            } else {
                encoded.append(i);
            }
        }
        return encoded.toString();
    }

3 个答案:

答案 0 :(得分:3)

每次迭代后你都没有递增移位。

int amountShifted = 5;

for (char i : userUpper.toCharArray()) {
    if (Character.isLetter(i)) {
        if (Character.isUpperCase(i)) {
            encoded.append((char) ('A' + (i - 'A' + shiftValue) % 26 ));
        } else {
            encoded.append((char) ('a' + (i - 'a' + shiftValue) % 26 ));
        }
    } else {
        encoded.append(i);
    }

    shiftValue += amountShifted % 26; // increment the shiftValue
}

答案 1 :(得分:1)

首先,您需要增加for循环的每次迭代的移位。

 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();
  }

其次,userUpper未定义。我在代码中将其更改为userString

要让用户选择文本移入的方向,您可以使用重载方法。

public static String rotate(String userString, int shiftValue, String direction) {
    if (direction == "Left") {
        return rotate(userString, -shiftValue);
    }
    else if (direction == "Right") {
        return rotate(userString, shiftValue);
    }
    else {
        return "This is not a valid way to shift your message.";
    }
}

请注意,这两种方法具有相同的名称,但它们采用不同的参数。调用方法时,请使用第二个方法。然后,您可以指定要转移消息的方式。

我已在您的新问题Changing the direction of a caesar shift in Java中添加了更多方法来执行此操作。

答案 2 :(得分:0)

如果您使用String.charAt和一个int for loop

,这将更加简单
    for (int i = 0; i < userString.length, i++) {
        if (Character.isLetter(i)) {
            if (Character.isUpperCase(i)) {
                encoded.append((char) ('A' + (userString.charAt(i) - 'A' + i) % 26 ));

这也不会起作用,因为它不会跟踪那些不会移动的非字符。您可以使用另一个int跟踪非字符,并调整encoded.append(...调用以使用它来获得正确的移位。我把它留给你作为练习