我马上就要说的是,该代码运行正确,但可能不会被严肃的程序员使用。其目的是用于教导小学生。我对社区的意见很感兴趣。
选项 1:
if (stringLength > 0 && subStringLength > 0 && stringLength >= subStringLength) {
for (int i = 0; i < stringLength; i = index + subStringLength) {
index = stringLowerCase.indexOf(subStringLowerCase, i);
if (index < 0)
break;
count++;
}
}
选项 2:
if (stringLength > 0 && subStringLength > 0 && stringLength >= subStringLength) {
count = (stringLength - stringLowerCase.replace(subStringLowerCase, "").length()) / subStringLength;
}
条件
if这个条件
stringLength > 0不是必要的。如果我们搜索的文本为空,我们应该返回零。即使没有这个条件,它也为零。这个条件
subStringLength > 0看起来合理。文本中空行会出现多少次?这个问题看似毫无意义,但是Java有一个明确的答案:stringLength + 1。文本的任意两个字符之间以及文本的开头和结尾处都会出现一个空行。这个答案背后有逻辑,我不会被它分散注意力。结论:该条件有道理,但是该案例也需要处理subStringLength == 0。这个条件
stringLength >= subStringLength不是必要的。情况与条件相同stringLength > 0:即使没有这个条件,代码也应该正常工作。难的
forfor (int i = 0; i < stringLength; i = index + subStringLength) {这是有效的代码,但它违反了非功能性要求“标题
for是自包含的,它不依赖于第三个变量”。这里有这样一个变量index。for– 一个非常复杂的结构,没有必要用外部依赖关系使其更加复杂。标题中的计算for可能依赖于循环中不会改变的变量。stringLength和subStringLength就是这样的变量。但这里的索引是多余的。如果无法简单写出
for,则应替换为while。大括号
始终在
if,else,while,中使用花括号for。当程序员在这样的文件主体中添加一行时,调试可能会很困难if。你可能会被告知,在这种简单的情况下可以省略括号,这样会使代码变得混乱,但统计数据表明,如果没有括号,你会更经常地感到头痛。subStringLength和subStringLowerCase,stringLength和stringLowerCase字符串在转换为大小写时会改变其长度。您的代码是在假设长度保持不变的情况下编写的。这是一个功能错误,一个复杂且令人不快的错误。
不区分大小写的搜索已损坏
这是一个功能错误。阅读compareToIgnoreCase的描述。这里说您需要将字符串转换为大写,然后转换为小写。但这还不是故事的全部。事实上,UNICODE定义了一个叫casefold的概念,专门用于允许不区分大小写的字符串比较,但这在Java中如果没有专门的库就无法实现。因此至少需要将其调高或调低。
通过循环计数
数过
replace只需替换一种方法就足够了:
分析
准确性和速度
我已经在上面写过了不区分大小写的搜索的正确性。
这两种方法都可以正确运行(如果您不考虑土耳其语字母的话)并且相对较快(如果您不排长队的话)。这两种方法都可以在长字符串上以二次时间运行。还有更高级的方法来搜索子字符串,但需要在库中寻找。
您选择的任务一方面具有实际用途。另一方面,为了完全正确且快速地解决这个问题,您将需要两个库:一个用于 UNICODE,另一个用于快速子字符串搜索。
代码风格
查找编码风格文档,例如Google Java 风格指南,并在代码格式中遵循它(顺便说一句,我不会这样做,因为我是个坏学生)。并告诉学生我们在课程中遵循此文档。这对于团队合作非常重要。现在对你来说事情已经不同了。
好的代码是简短的行。每一行都做一件事。这就是我写关于的注释的原因
for。例子必须完整。在您的问题中,您有代码片段,因此您没有解决整个问题,而只是解决了它的主要部分。并且所有边缘情况都需要处理(例如空行)或记录。
为所有主要和边缘情况提供带有使用示例的代码。解决方案的代码量和复杂性会根据其完整性而发生巨大变化。
附注:这不是问题,而是某种潘多拉盒子。