-2

第一次来这里。我正在尝试编写一个程序,该程序从用户那里获取字符串输入并使用 replaceFirst 方法对其进行编码。除了“`”(重音)之外的所有字母和符号都可以正确编码和解码。

例如当我输入

`12

我应该得到 28AABB 作为我的加密,但相反,它给了我 BB8AA2

public class CryptoString {


public static void main(String[] args) throws IOException, ArrayIndexOutOfBoundsException {

    String input = "";

    input = JOptionPane.showInputDialog(null, "Enter the string to be encrypted");
    JOptionPane.showMessageDialog(null, "The message " + input + " was encrypted to be "+ encrypt(input));



public static String encrypt (String s){
    String encryptThis = s.toLowerCase();
    String encryptThistemp = encryptThis;
    int encryptThislength = encryptThis.length();

    for (int i = 0; i < encryptThislength ; ++i){
        String test = encryptThistemp.substring(i, i + 1);
        //Took out all code with regard to all cases OTHER than "`" "1" and "2"
        //All other cases would have followed the same format, except with a different string replacement argument.
        if (test.equals("`")){
            encryptThis = encryptThis.replaceFirst("`" , "28");
        }
        else if (test.equals("1")){
            encryptThis = encryptThis.replaceFirst("1" , "AA");
        }
        else if (test.equals("2")){
            encryptThis = encryptThis.replaceFirst("2" , "BB");
        }
    }
}

我尝试将转义字符放在重音前面,但是,它仍然没有正确编码。

4

2 回答 2

2

看看你的程序在每次循环迭代中是如何工作的:

    • i=0
    • encryptThis = '12(我用 ' 而不是 ` 来更容易写这篇文章)
    • 现在你用 28 替换 ' 所以它会变成 2812
    • i=1
    • 我们在位置 1 读取字符,就是1这样
    • 我们用 AA 替换 1 2812->28AA2
    • i=2
    • 我们在位置 2 读取字符,就是2这样
    • 我们 2BBmake替换2812->BB8AA2

尝试使用appendReplacementfrom Matcherclass from java.util.regexpackage like

public static String encrypt(String s) {
    Map<String, String> replacementMap = new HashMap<>();
    replacementMap.put("`", "28");
    replacementMap.put("1", "AA");
    replacementMap.put("2", "BB");

    Pattern p = Pattern.compile("[`12]"); //regex that will match ` or 1 or 2
    Matcher m = p.matcher(s);
    StringBuffer sb = new StringBuffer();

    while (m.find()){//we found one of `, 1, 2
        m.appendReplacement(sb, replacementMap.get(m.group()));
    }
    m.appendTail(sb);

    return sb.toString();
}
于 2013-07-30T21:00:43.277 回答
0

encryptThistemp.substring(i, i + 1);子串的第二个参数是长度,你确定要增加i吗?因为这意味着在第一次迭代后test不会长 1 个字符。这可能会甩掉我们看不到的其他案例!

于 2013-07-30T20:41:52.820 回答