Java caesercipher(如果方法必须在字母表中循环,则无法工作)
对于给定的caesercipher方法,只要移位的字母不大于小写字母的“z”和大写字母的“z”,它似乎就能正常工作。看过我的代码后,我觉得前两个if块没有做任何事情。可能是什么问题Java caesercipher(如果方法必须在字母表中循环,则无法工作),java,loops,if-statement,Java,Loops,If Statement,对于给定的caesercipher方法,只要移位的字母不大于小写字母的“z”和大写字母的“z”,它似乎就能正常工作。看过我的代码后,我觉得前两个if块没有做任何事情。可能是什么问题 public static String caeserEncrypt(String originalMessage, int shift){ String finalMessage = " "; int length = originalMessage.length(); for(int
public static String caeserEncrypt(String originalMessage, int shift){
String finalMessage = " ";
int length = originalMessage.length();
for(int i= 0;i<length;i++){
char shiftedletter = (char)((int)(originalMessage.charAt(i))+shift);
if((int)shiftedletter>(int)'z'){
shiftedletter = (char)((int)(originalMessage.charAt(i))-(26-shift));
}
else{
shiftedletter= (char)((int)(originalMessage.charAt(i))+shift);
}
if((int)shiftedletter>(int)'Z'){
shiftedletter= (char)((int)(originalMessage.charAt(i))-(26-shift));
}
else{
shiftedletter= (char)((int)(originalMessage.charAt(i))+shift);
}
if((int) 'A' <= (int) (originalMessage.charAt(i)) && (int)(originalMessage.charAt(i)) <= 'Z'){
shiftedletter= (char)((int)(originalMessage.charAt(i))+shift);
}
else{
shiftedletter= originalMessage.charAt(i);
}
if((int) 'a' <= (int)(originalMessage.charAt(i)) && (int)(originalMessage.charAt(i)) <= 'z'){
shiftedletter= (char)((int)(originalMessage.charAt(i))+shift);
}
else{
shiftedletter= (char)(originalMessage.charAt(i));
}
finalMessage = finalMessage + shiftedletter;
}
return finalMessage;
}
问题在于您的条件,某些条件多次满足,因此移位字母会多次更改。 我不知道您的代码逻辑,但我认为您必须更新您的条件,以便使shiftedletter在每个循环中只更改一次
for(int i= 0;i<length;i++){
char shiftedletter = (char)((int)(originalMessage.charAt(i))+shift);
if((int)shiftedletter>(int)'z' || (int)shiftedletter>(int)'Z'){
shiftedletter = (char)((int)(originalMessage.charAt(i))-(26-shift));
}
else if(((int) 'A' <= (int) (originalMessage.charAt(i)) && (int)(originalMessage.charAt(i)) <= 'Z') || ((int) 'a' <= (int)(originalMessage.charAt(i)) && (int)(originalMessage.charAt(i)) <= 'z') || (int)shiftedletter <= (int)'z' || (int)shiftedletter <= (int)'Z'){
shiftedletter= (char)((int)(originalMessage.charAt(i))+shift);
}
else{
shiftedletter= (char)(originalMessage.charAt(i));
}
finalMessage = finalMessage + shiftedletter;
}
你的代码中有太多的如果。你只需要一个
static String caesarEncrypt(String originalMessage, int shift){
String finalMessage = "";
int length = originalMessage.length();
for(int i = 0; i < length; i++){
char shiftedLetter = (char)(originalMessage.charAt(i) + shift);
if (Character.isLowerCase(originalMessage.charAt(i)) && shiftedLetter > 'z' || Character.isUpperCase(originalMessage.charAt(i)) && shiftedLetter > 'Z')
finalMessage += (char)(originalMessage.charAt(i) - (26-shift));
else
finalMessage += shiftedLetter;
}
return finalMessage;
}
尝试将条件更改为更简单的条件:
String cipher(String msg, int shift){
String s = "";
int len = msg.length();
for(int x = 0; x < len; x++){
char c = (char)(msg.charAt(x) + shift);
if (c > 'z')
s += (char)(msg.charAt(x) - (26-shift));
else
s += (char)(msg.charAt(x) + shift);
}
return s;
}
编辑!
>我添加了一个更可读的代码,它将接受大写字符以及
上一个仅适用于小写字母a到z…:
因此,你的意思是,许多if语句同时执行,这给了我意想不到的结果。我已经发布了我的答案,我认为它将满足你的需要:我感谢大家的有益评论。这是我编辑过的源代码。我不允许使用任何字符方法,除了我使用的'a'
System.out.println(cipher("abc", 3)); //prints def
System.out.println(cipher("xyz", 3)); //prints abc
import java.util.Scanner;
public class CaesarCipher {
//Constants...
public static int NUMBER_OF_LETTERS_IN_ALPHABET = 26;
public static char LAST_LETTER_OF_THE_ALPHABET = 'z';
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String originalMessage;
int shift;
//get the inputs
System.out.print("Enter the original message: ");
originalMessage = scan.nextLine();
System.out.print("Enter the shift: ");
shift = scan.nextInt();
//use cipher method
System.out.println( cipher(originalMessage, shift) );
scan.close();
}
public static String cipher(String originalMessage, int shift) {
// TODO Auto-generated method stub
String newMessage="";
int len = originalMessage.length();
for(int index = 0 ; index < len ; index++){
//get the current char, convert it to lowercase then add the shift so that we don't have too many conditions
char currentChar = originalMessage.charAt(index);
char lowerCasedChar = Character.toLowerCase(currentChar);
char shiftedChar = (char)(lowerCasedChar+ shift);
if(shiftedChar> LAST_LETTER_OF_THE_ALPHABET){
shiftedChar = (char) (lowerCasedChar - (NUMBER_OF_LETTERS_IN_ALPHABET - shift));
}
//convert to upper case again if the original character was uppercase
if(Character.isUpperCase(currentChar)){
shiftedChar = Character.toUpperCase(shiftedChar);
}
//append to the new message
newMessage+= shiftedChar;
}
return newMessage;
}
}