替换字符串中的字母,但不替换已替换的字母

时间:2018-02-17 04:47:51

标签: java string replace

所以我正在创建一个程序来加密消息,然后解密它。

这是我的加密代码:

 private static String encrypt(String str){
        String string = str.toLowerCase();
        String string1 = string.replace('a', 'c');
        String string2 = string1.replace('b', 'v');
        String string3 = string2.replace('c', 'n');
        String string4 = string3.replace('d', 'm');
        String string5 = string4.replace('e', 'u');
        String string6 = string5.replace('f', 'd');
        String string7 = string6.replace('g', 'o');
        String string8 = string7.replace('h', 'l');
        String string9 = string8.replace('i', 'p');
        String string10 = string9.replace('j', 'e');
        String string11 = string10.replace('k', 'q');
        String string12 = string11.replace('l', 'k');
        String string13 = string12.replace('m', 'a');
        String string14 = string13.replace('n', 't');
        String string15 = string14.replace('o', 'j');
        String string16 = string15.replace('p', 'f');
        String string17 = string16.replace('q', 's');
        String string18 = string17.replace('r', 'g');
        String string19 = string18.replace('s', 'w');
        String string20 = string19.replace('t', 'b');
        String string21 = string20.replace('u', 'y');
        String string22 = string21.replace('v', 'i');
        String string23 = string22.replace('w', 'x');
        String string24 = string23.replace('x', 'r');
        String string25 = string24.replace('y', 'z');
        String string26 = string25.replace('z', 'h');

        return string26;
    }

以字母h和i为例。如果你查看我的笔记和代码,你可能认为它应该输出:" lp"但是,因为如果你仔细观察' h'到了' l'到了'我'到了' p' ' p'并且' l'再次切换。无论我如何移动解密器中的数字,我都无法匹配这个系统,有些单词可以使用,但与其他单词无关。

我正在寻找一种方法让系统知道它已经编辑了那封信并跳过它,是否有人有 任何 的想法?

3 个答案:

答案 0 :(得分:4)

您可以创建一个字符数组,将字符a的加密版本保存到z

char [] encryptChars = new char[]{'c', 'v', .... 'h'};

private static String encrypt(String str){
    StringBuilder stringBuilder = new StringBuilder();
    String s = str.toLowerCase();
    for(char c : s.toCharArray()) {
        stringBuilder.append(encryptChars[c - 'a']); 
    }
    return stringBuilder.toString();
}

encryptChars按顺序保存az 的加密字符。 这里假设源字符串只包含集合[A-Za-z]中的字符。如果它们有任何其他ASCII字符,则需要在 for 循环中处理它们。

答案 1 :(得分:0)

根据您的代码,您的新角色会被后续的string.replace调用所取代。相反,你可以做这样的事情:

 private static String encrypt(String str){
    String string = str.toLowerCase();
    for(int i = 0; i < string.length(); i++)
    {
        char ch = string.charAt(i);

        switch(ch)
        {
            case 'h':
            {
                string = string.substring(0,i)+"l"+string.substring(i+1);
                break;
            }
            case 'i':
            {
                string = string.substring(0,i)+"p"+string.substring(i+1);
                break;
            }
            default:
            {
                System.out.println("Enter a-z");
                break;
            }
        }

    }
    return string;
}

上面的代码会找到每个字符然后替换它,但不会再返回重新替换已经替换的字符。

答案 2 :(得分:0)

这是因为代码现在已经完成替换,但它会再次更改它,因为代码会继续执行代码,直到它到达return行。

例如:

我输入了字符串Test,系统会一直运行,直到看到这一行String string20 = string19.replace('t', 'b');,这意味着字母t变成了b,但是系统甚至不关心哪个字母是第一个和最后一个,它会检查整个字符串Test是否有。

如果我这样做

String oldString = "test";
String newString = oldString.replace("a", "b").replace("b", "c").....replace("y", "z");
System.out.println(newString);

输出是这样的:

zzzz

但是如果你想要答案,请查看其他答案,这个答案只是解释你的代码。