用户可以通过向左选择1或向右选择2来选择向左或向右移动字母。左工作正常,右工作不正常。现在,它显示出完全相同的循环,但是我玩过以不同方式更改所有+和-符号的过程,但最终总是得到奇怪的字符。如何获得将字符向相反方向移动的程序?如果用户键入Hi,并且移位值是一个且方向正确,则H应变为G,i应变为k,因为要移动的量应增加在每个字母之前。此外,当前的第一个字母未更改,情况并非如此。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();} (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 在您的代码中,您将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; } (adsbygoogle = window.adsbygoogle || []).push({});
10-06 09:06