groovy if语句返回错误的答案

时间:2016-02-14 17:58:34

标签: groovy

List sortList(List list1){
    def sorted = []
    while(list1){
        def lowest
        for(n in list1){
            if(!lowest || lowest == null || n < lowest) lowest = n
        }
        sorted.add(sorted.size, lowest)
        list1.remove(list1.indexOf(lowest))  
    }
    return sorted
}

def odds = [0,-6,2]
assert sortList(odds) == [-6,0,2]

上面的代码对整数进行排序。这是CoderDojo中为孩子们设置问题的解决方案。它正确地对整数列表进行排序,但是如果列表中有0,则当n <1时,条件语句返回true。最低,(当n == 2且最低== 0时)。下面是代码运行时控制台的输出。

Caught: Assertion failed:        

assert sortList(odds) == [-6,0,2]    
       |        |     |            
       |        []    false
       [-6, 2, 0]               

Assertion failed:          

assert sortList(odds) == [-6,0,2]                  
       |        |     |                            
       |        []    false                        
       [-6, 2, 0]                                  

        at TonyZeroTest.run(TonyZeroTest.groovy:19)
        at RunScript.run(RunScript.groovy:66)


Process exited with code: 1

任何帮助理解这一点将不胜感激。

2 个答案:

答案 0 :(得分:3)

这一行存在问题:

if(!lowest || lowest == null || n < lowest) lowest = n

lowest = 0时发生。我不确定为什么要测试!lowestlowest == null。当lowest为0时,!lowest为真,并且您将lowest重新分配给n的任何值,无论它是否小于当前lowest {1}}(0)。

只需删除!lowest条件,就应该做得很好。

有关!lowest == true原因的更多信息,请点击此处:http://groovy-lang.org/semantics.html#Groovy-Truth

答案 1 :(得分:0)

移动我的评论回答:

我不知道groovy是如何工作的,但我会假设!lowest评估!0 =&gt; true,因此当前一个值为0时,要检查的下一个值将变为最低值。

也许初始化最低为null,然后只检查它是否为空或更低:

def lowest = null
for(n in list1){
    if(lowest == null || n < lowest) lowest = n
}