2

对于我的方法,分区,对于我的快速排序,我运行它就可以了。但是,每当我在项目提交页面上上传时,测试都会对该代码的设计返回否定结果。这就像

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
}

我知道这个测试服务器是有线的,所以我从这种原因中得到了分数。如何重新编写执行相同操作的代码?

4

1 回答 1

2

那些 Checkstyle 和 PMD 消息并不完全是错误。它们显示了可能出现错误和不良编程风格的地方。

在您的情况下,它们在某种程度上是错误的:

while ((r != 0) && ((array.get(--r).compareTo(pivot) > 0))) ;

它是否在条件内起作用,;and 省略{}是故意的,因为循环没有主体。这些错误消息的主要原因是您的循环有主体。或者打算有一个,但不小心添加了一个;,现在你没有。

然而,像这样的结构,即“滥用”评估表达式以完成实际工作的部分变得非常复杂,难以快速阅读。复杂不是好风格。

while (r > 0) {
    T element = array.get(--r);
    if (element.compareTo(pivot) <= 0) {
        break;
    }
}

虽然更冗长,但应该和以前一样。(r > 0 比 r != 0 更稳定,所以我改变了它。)我想它会以这种方式通过样式检查。

您也可以尝试用其中;带有一些注释的块替换 (因为“应该记录空块”应该是另一种风格,至少在 Eclipse 中是这样。)取决于这些工具认为不好的风格。

while ((r != 0) && ((array.get(--r).compareTo(pivot) > 0))) { /* empty */ }
于 2014-11-08T02:10:22.100 回答