Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 替换字符串中的字母,但不替换已替换的字母_Java_String_Replace - Fatal编程技术网

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

Java 替换字符串中的字母,但不替换已替换的字母,java,string,replace,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

因此,我正在制作一个程序,将加密一条消息,然后解密它

这是我的加密代码:

 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”到“i”到“p”,那么“p”和“l”会再次切换。无论我如何在解密程序中移动数字,我都无法匹配这个系统,因为有些词它可以工作,但有些词它不能


我正在寻找一种方法,让系统知道它已经编辑了那封信并跳过它,有人有什么想法吗?

你可以创建一个字符数组,其中包含加密版本的字符
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
按顺序保存
a
z
的加密字符。
这里的一个假设是,源字符串将只包含set
[A-Za-z]
中的字符。如果它们有任何其他ASCII字符,您需要在for循环中处理它们。

根据您的代码,新字符将不断被后续字符串替换。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;
}
私有静态字符串加密(字符串str){
String String=str.toLowerCase();
对于(int i=0;i

上述代码将找到每个字符,然后将其替换,但不会返回以重新替换已替换的字符。

这是因为代码现在已完成替换,但它将再次更改,因为代码将继续执行代码,直到到达返回行

例:

我输入了字符串
Test
,然后系统运行,直到它看到这一行
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

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

是的,我明白你的意思。我得到了我的代码,但我只是想找到一个解决方案,如何使它跳过已经被替换的代码。谢谢。我只是在解释你的代码中的错误,我还说了
查看其他人的答案
,只是为了让你知道其他人的答案是正确的,我只是在向你解释。我查看了你的代码,这是我的想法。说你正在用你现在拥有的“嗨”。是我还是会这样:string=“hi”;你得到“h”+“l”+“i”=hli?就第一个例子来说,你有hli(假设它没有把l作为第二个字符?),我只是不明白,如果我很愚蠢,我很抱歉。不,不,如果它找到“h”,它会从h+1的索引中创建一个子字符串,从下一个术语开始,然后将它附加到“l”中。我基本上是通过创建一个字符串来替换该字符,该字符串在要替换的术语之前包含所有术语,并添加新字符,后跟字符串中的剩余字母。我希望这能澄清你的问题。