对于我的方法,分区,对于我的快速排序,我运行的时候是没问题的。但是,每当我在项目提交页面上上传时,测试都会返回此代码设计的负面结果。这就像
static long partition(DataArray array, long l, long r, Record pivot)
throws Exception {
do { // Move bounds inward until they meet
while (array.get(++l).compareTo(pivot) < 0)
;
这一行,我得到..三个错误...
错误 [Checkstyle]:-2 该语句只是一个“;”因此,什么也不做。您可能添加了“;”在不适当的位置(例如在 if 或 for 循环之后)。查看是否缺少代码或只是删除多余的“;”。
错误 [PMD]:-1(超出限制) 最好始终将 while 循环体中的代码用大括号括起来。它有助于减少出错的可能性。
错误 [PMD]:0(超出限制) 这个 while 循环体是空的。确保在 while 后面没有误加分号 (;)。如果您不需要在循环体中执行任何操作,则可以完全省略循环。
while ((r != 0) && ((array.get(--r).compareTo(pivot) > 0)))
;
这里还有另外三个错误
错误 [Checkstyle]:-2 该语句只是一个“;”因此,什么也不做。您可能添加了“;”在不适当的位置(例如在 if 或 for 循环之后)。查看是否缺少代码或只是删除多余的“;”。
错误 [PMD]:0(超出限制) 最好始终将 while 循环体中的代码用大括号括起来。它有助于减少出错的可能性。
错误 [PMD]:0(超出限制) 这个 while 循环体是空的。确保在 while 后面没有误加分号 (;)。如果您不需要在循环体中执行任何操作,则可以完全省略循环。
swap(array, l, r); // Swap out-of-place values
}
while (l < r); // Stop when they cross
swap(array, l, r); // Reverse last, wasted swap
return l; // Return first position in right partition
}
我知道这个测试服务器是有线的,所以我会因为这种原因而扣分。我如何重写这段代码来执行相同的操作?
最佳答案
那些 Checkstyle 和 PMD 消息并不完全是错误。它们显示了可能出现错误和不良编程风格的地方。
在您的案例中,他们在某种程度上是错误的:
while ((r != 0) && ((array.get(--r).compareTo(pivot) > 0))) ;
does it's job inside the condition,;
和省略 {}
是故意的,因为没有循环体。这些错误消息的主要原因是循环中有主体的情况。或者本来想拥有一个,但不小心添加了 ;
,但现在却没有了。
然而,像这样的构造,即“滥用”计算表达式的部分来完成实际工作,会变得非常复杂,难以快速阅读。复杂不是好风格。
while (r > 0) {
T element = array.get(--r);
if (element.compareTo(pivot) <= 0) {
break;
}
}
虽然更加冗长,但应该与以前相同。 (r > 0 比 r != 0 更稳定,所以我改变了这一点。)我想这样它会通过样式检查。
您也可以尝试将 ;
替换为带有一些注释的 block (因为“空 block 应该被记录”应该是另一种风格的东西,至少在 Eclipse 中是这样。)那些工具认为什么是不好的风格。
while ((r != 0) && ((array.get(--r).compareTo(pivot) > 0))) { /* empty */ }
关于java - do while循环设计有设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812784/