Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_Recursion_Substring_Indexof - Fatal编程技术网

Java 递归操作字符串

Java 递归操作字符串,java,string,recursion,substring,indexof,Java,String,Recursion,Substring,Indexof,此方法所属的程序使用简单密码(即“ABCD”到“1,2,3,4”或“1,2,3,4”到“ABCD”)对消息进行编码和解码。编码消息由冒号分隔的数字组成。字符串中的每个值都应该转换为int,然后转换为chars,最后连接为结果字符串。这个方法应该递归地解码消息,但这是我第一次使用递归,所以它还不起作用。这就是我一直收到的错误 线程“AWT-EventQueue-0”java.lang.StringIndexOutOfBoundsException中的异常:字符串索引超出范围:-1” 方法: pub

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

线程“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

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

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

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

例如。
String decoded=encoded.replace(“26”,“z”)。replace(“25”,“y”)……replace(“1”,“a”)。replace(“1”,“a”)


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

递归解码消息的确切含义是什么?我很难弄清楚你的代码打算做什么。给我们一个将递归几次的输入,以及递归的每个阶段的输出,或者如果阶段太多,则是几个重要阶段的输出。您使用的
indexOf
方式错误。它需要一个字符串或字符,并将在字符串中找到该字符的位置。你交出某种职位。此位置值用作字符,并导致
msg.indexOf
返回
-1
,因为在字符串中找不到该字符。如果可以使用Java 8,请使用集合和映射/筛选方法以及lambdas。某些方法正在尝试获取不存在的字符串元素的值