Java替换方法问题

Java替换方法问题,java,string,encryption,replace,Java,String,Encryption,Replace,我正在为我的计算机科学课做一个名为“加密/解密”的项目 代码如下 import java.io.*; import java.util.*; import java.io.*; import java.util.*; public class Tester { public static void main(String args[]) { Scanner kbReader = new Scanner(System.in); System.out.print("E

我正在为我的计算机科学课做一个名为“加密/解密”的项目

代码如下

import java.io.*; 
import java.util.*; 
import java.io.*; 
import java.util.*; 

public class Tester { 
public static void main(String args[]) { 
    Scanner kbReader = new Scanner(System.in); 
    System.out.print("Enter a sentence that is to be encrypted: "); 
    String sntnc = kbReader.nextLine(); 
    System.out.println("Original Sentence = " + sntnc); 

    Crypto myCryptObj = new Crypto(); 
    String encryptdSntnc = myCryptObj.encrypt(sntnc); 
    System.out.println("Encrypted sentence = " + encryptdSntnc); 

    String decryptdSntnc = myCryptObj.decrypt(encryptdSntnc); 
    System.out.println("Decrypted sentence = " + decryptdSntnc); 
  } 
} 

class Crypto { 
 public String encrypt(String sntnc) { 
    sntnc = sntnc.replace("m", "ssad"); 
    sntnc = sntnc.replace("b", "dug>?/");
    sntnc = sntnc.replace("g", "jeb..w"); 
    sntnc = sntnc.replace("v", "ag',r"); 
    return sntnc; 
} 

public String decrypt(String sntnc) { 
    sntnc = sntnc.replace("ag',r", "v"); 
    sntnc = sntnc.replace("ssad", "m"); 
    sntnc = sntnc.replace("jeb..w", "g");  
    sntnc = sntnc.replace("dug>?/", "b"); 
    return sntnc; 
  } 
}
问题不在
Tester
类中,而是在
Crypto
类中

输入是:
这是一个非常重要的早晨。
代码应该输出:

Enter a sentence that is to be encrypted: This is a very big morning.
Original Sentence: This is a very big morning.
Encrypted sentence: This is a ag',rery dug>?/ijeb..w ssadorninjeb..w.
Decrypted sentence: This is a very big morning.
但是,
加密语句
行正在打印:

This is a ag',rery dujeb..w>?/ijeb..w ssadorninjeb..w.
sntnc.replace
方法正在替换已替换的字母。
如何将其修复到不会两次替换的位置?

问题来自替换字符串的逻辑:

sntnc = sntnc.replaceAll("b", "dug>?/");  // <-- replaces with a "g" here
sntnc = sntnc.replaceAll("g", "jeb..w");  // <-- so that "g" is also getting replaced here

而不是使用
sntnc=sntnc.replaceAll(“m”、“ssad”)
尝试用适当的加密代码替换每个字符,然后将其保存在另一个字符串中并返回

`String s = "xyz";
for(int i = 0; i < sntnc.length(); i++)
{
   char c = sntnc.charAt(i);
   // Do your code here saving it in a new string say sntnc2
}`
   return sntnc2;
`String s=“xyz”;
对于(int i=0;i

可能不是最有效的方法,但使用
replaceAll(“a”,“c”)
将字符串开头到结尾的每个字符
a
替换为
c

您的问题是一个替换与另一个替换相交:

sntnc = sntnc.replace("g", "jeb..w"); 
sntnc = sntnc.replace("b", "dug>?/");
第一个包括a
b
,第二个包括a
g
,即使重新排序,替换也不会起作用

您必须一次完成所有替换,请尝试:

class Crypto { 
 public String encrypt(String sntnc) {    

    Pattern p = Pattern.compile("(m|g|b|v)");
    Matcher m = p.matcher(sntnc);
    StringBuffer sb = new StringBuffer();

    while (m.find()) {
        if(m.group(1).equals("m"))
            m.appendReplacement(sb, "ssad");
        if(m.group(1).equals("g"))
            m.appendReplacement(sb, "jeb..w");
        if(m.group(1).equals("b"))
            m.appendReplacement(sb, "dug>?/");
        if(m.group(1).equals("v"))
            m.appendReplacement(sb, "ag',r");
    }

    m.appendTail(sb);

    return sb.toString(); 
} 

replaceAll
用于正则表达式。你在使用正则表达式吗?如果不知道(或者你不知道),你可能想用
replace
来代替它。@tobias_k噢,我的意思是解决这个问题,然后取下
replaceAll
。我只是在胡闹,看看这能不能解决问题。但是即使使用
replace
它仍然不起作用。
从循环中返回
?对不起,我的错误。假设“加密”从来不是彼此的子串;对可变长度代码进行同样的解密将是一件棘手的事情。这很有效,谢谢!因此,这里没有简单的方法来实际使用
replace
,因为无论发生什么情况,它都会被替换?@Hartja是的。您无法判断要替换的字符是否已经不是加密字符串的一部分(这是因为没有中间的不同结构,
replace
可以正常工作)@tobias_k True,但否则将不再有赋值;)。
class Crypto { 
 public String encrypt(String sntnc) {    

    Pattern p = Pattern.compile("(m|g|b|v)");
    Matcher m = p.matcher(sntnc);
    StringBuffer sb = new StringBuffer();

    while (m.find()) {
        if(m.group(1).equals("m"))
            m.appendReplacement(sb, "ssad");
        if(m.group(1).equals("g"))
            m.appendReplacement(sb, "jeb..w");
        if(m.group(1).equals("b"))
            m.appendReplacement(sb, "dug>?/");
        if(m.group(1).equals("v"))
            m.appendReplacement(sb, "ag',r");
    }

    m.appendTail(sb);

    return sb.toString(); 
}