嘿伙计们,我真的在努力搞清楚我程序的一部分。现在,它需要用户输入一个班次并转移加密。但是,当用户输入班次时,我希望程序每次都进一步移动。所以说传入的字符串只是单词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();
}
答案 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(...
调用以使用它来获得正确的移位。我把它留给你作为练习