Java - 字母替换不起作用

时间:2014-07-04 05:39:33

标签: java string substitution

我正在读一本关于密码学的书,并认为编写一个编码和解码消息的小程序是一个很酷的主意。

我开始使用一个简单的替换密码,它会替换一个带有不同字母的字母,移动一定的设定数量。 IE浏览器。一个例子是:a-> c,b-> d等,只是移动了2。

我的代码似乎没有正确替换字母。它总是输出我输入的相同内容,甚至认为Key已设置。这是我的代码:

public class Keyshift {

public static int Key = 0;

public static void selectKey(){
    Scanner in = new Scanner(System.in);
    System.out.println("Enter an integer");
    int a = in.nextInt();
    Key = Key + a;
}

public static void encode(){

    String input = "";
    Scanner in = new Scanner(System.in);
    System.out.println("Enter a string");
    input = in.nextLine();

    String[] inputLetters = input.split("");
    String[] output = new String[inputLetters.length];

    String dictLowercase = new String("abcdefghijklmnopqrstuvwxyz");
    String dictUppercase = new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    String[] dictLowerArray = dictLowercase.split("");
    String[] dictUpperArray = dictUppercase.split("");


    for(int i=0;i<inputLetters.length;i++){
        for(int c=0;c<25;c++){
            if (inputLetters[i]==dictLowerArray[c]){
                output[i] = dictLowerArray[((c+Key) % 26)];
            }
            else if (inputLetters[i]==dictUpperArray[c]){
                output[i] = dictUpperArray[((c+Key) % 26)];
            }
            else {
                output[i] = inputLetters[i];
            }
        }
    }
    System.out.println("Your encoded message is: ");
    System.out.println(Arrays.toString(output));   
    //System.out.println(Key);
}
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    selectKey();
    encode();
}

}

2 个答案:

答案 0 :(得分:1)

        String dictLowercase = new String("abcdefghijklmnopqrstuvwxyz");
        String dictUppercase = new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        char[] dictLowerArray = dictLowercase.toCharArray();//Use toCharArray
        char[] dictUpperArray = dictUppercase.toCharArray();
        char[] inputLetters = input.toCharArray();
        char[] output=new char[inputLetters.length];
        for(int i=0;i<inputLetters.length;i++){
            for(int c=0;c<25;c++){
                if (inputLetters[i]==(dictLowerArray[c])){
                    output[i] = (char) (dictLowerArray[c]+Key % 26);//Logic Issue
                }
                else if (inputLetters[i]==(dictUpperArray[c])){
                    output[i] = (char) (dictUpperArray[c]+Key % 26);
                }
                else {
                      output[i] = inputLetters[i];//If not alphabets
                }                
            }
          }
  • 为方便起见,请使用char操作而不是String
  • 使用.toCharArray()代替split
  • 您可以直接在角色上使用character+Key % 26

答案 1 :(得分:1)

首先尝试与String进行比较equals而不是==。 此外,如果您发现某些内容已被修改,则无法指定任何break点。比如说,inputLetters的第一个字符与dictLowerArray的第一个字母匹配,现在迭代再次进入第二个循环,这次只有最后一个else块被执行且值相同,在inputLetters中被复制到output数组。

试试这个循环:

for(int i=0;i<inputLetters.length;i++){
        for(int c=0;c<25;c++){
            flag = false;
            if (inputLetters[i].equals(dictLowerArray[c])){
                output[i] = dictLowerArray[((c+Key) % 26)];             
                break;
            }
            else if (inputLetters[i].equals(dictUpperArray[c])){
                output[i] = dictUpperArray[((c+Key) % 26)];
                break;              
            }
            else {
                flag = true;
            }
        }
        if (flag) {
            output[i] = inputLetters[i];
        }
    }