Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java caesercipher(如果方法必须在字母表中循环,则无法工作)_Java_Loops_If Statement - Fatal编程技术网

Java caesercipher(如果方法必须在字母表中循环,则无法工作)

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

对于给定的caesercipher方法,只要移位的字母不大于小写字母的“z”和大写字母的“z”,它似乎就能正常工作。看过我的代码后,我觉得前两个if块没有做任何事情。可能是什么问题

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

}