递归操作字符串

时间:2015-04-09 12:50:16

标签: java string recursion substring indexof

此方法所属的程序使用简单密码对消息进行编码和解码(即' ABCD' 1,2,3,4'或' 1,2 ,3,4' ABCD')。编码消息包含的数字是冒号分隔的。字符串中的每个值都应该转换为整数,然后转换为字符,最后连接成结果字符串。这个方法应该递归地解码消息,但这是我第一次搞乱递归,所以它还没有起作用。这是我收到的错误

  

"线程中的异常" AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1"。

方法:

public static String DecodeR(String msg, String result) {
    if (msg.length()>0) {
       int pos =1;
       pos += msg.indexOf(",");
       int x = Integer.parseInt(msg.substring(0,msg.indexOf(",")));
       if (x==0) {
          x=32;
          return DecodeR ((msg.substring(msg.indexOf(pos))),result+=String.valueOf((char)x));
      } else if (x==99) {
          x=63;
          return DecodeR ((msg.substring(msg.indexOf(pos))),result+=String.valueOf((char)x));
      } else {
          x=x+64;
          return DecodeR ((msg.substring(msg.indexOf(pos))),result+=String.valueOf((char)x));
      }

    } else {
        return result;
    }
}//end of DecodeR
编辑:我未能正确设置导致递归继续的基本情况,直到导致负索引位置。此外,我对substring和indexOf的理解不足,导致首先出现错误的字符串解析。完成的代码:

    public static String DecodeR(String msg, String result) {
    if (msg.length() == 0) {
       return result;
    }

    int commaPosition = msg.contains(",") ? msg.indexOf(",") : msg.length();
    int charCode = Integer.parseInt(msg.substring(0, commaPosition));

    String remainingString = msg.contains(",") ? msg.substring(commaPosition+1, msg.length()) : "";

    if (charCode == 0) {
       charCode = 32; 
    } else if (charCode == 99) {
       charCode = 63;
    } else {
       charCode += 64;
   }

    result += String.valueOf((char)charCode);
    return DecodeR(remainingString, result);

}//end of DecodeR

感谢您的帮助,非常感谢您的建议。

1 个答案:

答案 0 :(得分:0)

有一种更简单的解码方法:

例如a = 1和z = 26,并且中间的所有字母都是它们各自的数字,你所要做的就是找每个说24并用x替换它。这可以通过使用字符串替换方法来完成,而不是必须按最大数字到最小数字的顺序替换。

EG。 String decoded = encoded.replace("26", "z").replace("25", "y")........replace("1", "a").replace(",", "");

这将允许您为每个字符分配数字,并且还可以删除冒号,而无需使用之前使用的巨大方法来替换它们。