4

Groovy 断言包含:

assert testList.contains(4)
   |        |
   |        false
   [1, 2, 6, 3, 4]

我要疯了吗?

这是测试代码:

    List testList = tester.getFactors(12)
    assert testList.size() == 5
    assert testList.contains(1)
    assert testList.contains(2)
    assert testList.contains(3)
    assert testList.contains(4)
    assert testList.contains(6)

如果我删除了 contains(4) 和 contains(6) 之外的所有内容,则它们中的一个或两个都会失败。

这是 getFactors 方法:

 List getFactors(int number)
     {
      def retList = new ArrayList();
      (1..Math.sqrt(number)).each() { i ->
       if(number % i == 0)
       {
           //add both the number and the division result
            retList.add(i) 
            if(i>1)
                retList.add(number / i)
       }
    }
    retList;
}

任何想法都非常感谢。

4

1 回答 1

6

如果你这样做:

println getFactors( 12 )*.class.name

你可以看到:

[java.lang.Integer, java.lang.Integer, java.math.BigDecimal, java.lang.Integer, java.math.BigDecimal]

所以 the6和 the4BigDecimal实例,而不是Integer实例

所以contains失败(正如你所寻找的Integer(6)那样BigDecimal(6)

如果你改变:

            retList.add(number / i)

至:

            retList.add(number.intdiv( i ) )

然后您的结果将保持为整数,并且您的断言应该有效:-)

顺便说一句,只是为了好玩,您的函数可以重写为:

List getFactors( int number ) {
    (1..Math.sqrt(number)).findAll { i -> number % i == 0 }
                          .collectMany { i ->
                              if( i > 1 ) {
                                  [ i, number.intdiv( i ) ]
                              }
                              else {
                                  [ i ]
                              }
                          }
}
于 2013-10-30T16:32:05.070 回答