在Java中查找字符串中的子字符串
我正在编写一个程序来在
Java中查找字符串中的子字符串,而不使用任何Java库.
我编写了一个函数subString(String str1,String str2),如下所示. 它适用于以下输入: > str1 =“rahul” 当我输入输入时出现问题: > str1 =“rahul” 它进入无限循环.任何人都可以查看我的代码片段并帮助我. public static boolean subString(String str1,String str2) { boolean found = false; int len1 = str1.length(); int len2 = str2.length(); int status = 0; char[] arr1 = new char[len1]; char[] arr2 = new char[len2]; for (int ii = 0; ii < len1; ii++) { arr1[ii] = str1.charAt(ii); } for (int jj = 0; jj < len2; jj++) { arr2[jj] = str2.charAt(jj); } for (int ii = 0; ii < len1; ii++) { for (int jj = 0; jj < len2; jj++) { if (arr1[ii] == arr2[jj]) { if (ii < len1 - 1) { System.out.println("Found1::" + "arr1::" + arr1[ii] + "and arr2::" + arr2[jj]); found = true; ii++; } else if (arr1[ii] == arr2[jj] && ii == len1 - 1) { System.out.println("Found2::" + "arr1::" + arr1[ii] + "and arr2::" + arr2[jj]); found = true; break; } } else if (found == false && arr1[ii] != arr2[jj]) { System.out.println("Found3::" + "arr1::" + arr1[ii] + "and arr2::" + arr2[jj]); found = false; } else if (found == true && arr1[ii] != arr2[jj]) { System.out.println("Found4::" + "arr1::" + arr1[ii] + "and arr2::" + arr2[jj]); found = false; ii = 0; } } } return found; } } 解决方法
其他人建议使用String.contains() – 这是java.lang代码,而不是Java库.但是,你显然想要探索如何自己做到这一点.一种方法是查看
String.contains() 的OpenJDK 7源代码,它的封面使用
String.indexOf() .你可以看到他们在那里使用的(相当基本的)算法.
你的代码有问题 有趣的是,当我将代码粘贴到我的开发环境中时,你的代码适用于“rahul”和“rararahul”.但是,存在非匹配的无限循环.对于包含str1的任何字符的任何str2,都会发生这种情况.这是因为一旦在str2中找到str1中任何字符的匹配项,就会重置变量以重新开始.如果你查看它通过每个字符串的序列,你的输出实际上足以调试它. 可能的修复 如果您想要追求自己的方法并从中学习,那么请考虑使用自己的方法停止并在纸上进行一些设计.你正在寻找str2中str1的出现.所以你可能想换掉你的循环.那么你可以更有效率.您可以在外部循环中逐个字符地查看更长的String(str2)字符.如果较短字符串(str1)的第一个字符与你在str2中处理的字符匹配,那么你只需要进入内部循环. 例如代码的循环位 boolean retFound = false; for (int jj = 0; jj < len2; jj++) { if (arr1[0] == arr2[jj]) { boolean tempFound = true; int foundIndex = jj; for (int ii = 0; ii < len1; ii++) { if (arr1[ii] != arr2[jj+ii]) { tempFound = false; break; } } if (tempFound) { System.out.println("Found substring " + str1 + " in " + str2 + " at index " + foundIndex); System.out.println("Carrying on to look for further matches..."); tempFound = false; retFound = true; } } } return retFound; 注意,这不会很快,但它应该工作.我已经测试了你提供的所有字符串样本.你也得到奖金 – 它会找到多个匹配.如果你不想那样(只是想要真假),当它说“继续寻找……”时突然爆发. 正如其他人所说,如果你想继续使用原始代码,当然不要试图在内循环中改变循环变量(即ii).这是不好的做法,难以阅读并容易出现大量错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java中的try-catch-finally中的return的执行顺序
- 第3周Java编程总结
- java – 如果applet在浏览器的JRE中运行,为什么机器上需要J
- 想成为顶尖 Java 程序员?请先过了下面这些技术问题。
- Laravel 5.3 – ClassLoader.php第414行中的ErrorException
- 如何在Java中安装GSON模块?
- java – 如何使用反射来调用参数的方法?
- 走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程
- JAAS authentication in Tomcat example--reference
- Java基于分治算法实现的棋盘覆盖问题示例