2013-10-30 33 views
4

Groovy的斷言與包含該項目包含失敗: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) 

如果刪除以外的所有含有(4)和包含(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; 
} 

任何想法不勝感激。

回答

6

如果你這樣做:

println getFactors(12)*.class.name 

你可以看到:

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

所以64BigDecimal實例,而不是Integer實例

所以contains失敗(因爲你正在尋找Integer(6)不是BigDecimal(6)

如果更改:

  retList.add(number/i) 

到:

  retList.add(number.intdiv(i)) 

那麼你的結果將保持爲整數,你應該斷言:-)

工作BTW,只是爲了好玩,您的功能可以改寫爲:

List getFactors(int number) { 
    (1..Math.sqrt(number)).findAll { i -> number % i == 0 } 
          .collectMany { i -> 
           if(i > 1) { 
            [ i, number.intdiv(i) ] 
           } 
           else { 
            [ i ] 
           } 
          } 
} 
+0

謝謝!並感謝重寫函數 - 有趣的:) – FOOM

+1

@FOOM不用擔心:-)我甚至會認爲'collectMany'應該是:'collectMany {i - > [i,number.intdiv(i)]}'' ,就好像你將要把'1'作爲一個因素一樣,你也可以擁有這個數字本身:-)玩得開心,祝你好運! –

相關問題