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>?/");
第一个包括ab
,第二个包括ag
,即使重新排序,替换也不会起作用
您必须一次完成所有替换,请尝试:
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();
}