2015-02-05 15 views
-1

因此,這裏是我的解決方案代碼:爲什麼在這個JUnit測試中顯示錯誤的數字?

public int count_two_char(String s, char c, char d){ 
    int count = 0; 
    int count1 = 0; 

    for (int i = 0; i < s.length(); i++) { 
     if (s.charAt(i) == c) { 
      count = count + 1; 
     } 

     for (int i1 = 0; i1 < s.length(); i1++) { 
      if (s.charAt(i1) == d) { 
       count1 = count1 + 1; 
      } 
     } 
    } 
    return count + count1; 
} 

這裏是我的測試代碼:

@Test 
public void tests3() { 
    code.Solution s = new code.Solution(); 
    String input = "llss"; 
    int expected = 4; 
    char c ='l'; 
    char d ='s'; 
    int actual = s.count_two_char(input, c, d); 
    assertTrue("Expected was" +expected+"but the actual was" +actual , expected == actual); 
} 

但是當我測試它。它顯示預期的錯誤是4,但實際是10。我現在很混亂。

+6

您可以使用'assertEquals(expected,actual)'。如果發生故障,它會自動顯示與您的消息類似的消息,而無需自己寫。 – h7r 2015-02-05 21:40:47

+0

你的循環是嵌套的,實際上它看起來像你想要兩個獨立的循環。我建議完全消除其中的一個循環,然後在遇到它時只比較一次。事實上,它看起來像你的單元測試功能正常,因爲它捕捉到你的函數不正確的行爲。打的好。 – 2015-02-05 21:43:06

回答

7

因爲你的大括號沒有很好地縮進,所以看起來你有兩個單獨的for循環。不過還好排隊起來後:

for(int i=0; i<s.length(); i++){ 
    if(s.charAt(i) == c){ 
     count = count + 1; 
    } 


    for(int i1=0; i1<s.length(); i1++){ 
     if(s.charAt(i1) == d){ 
      count1 = count1 + 1; 

     } 

    } 

    } 

你可以看到,第二for循環嵌套第一for循環中,所以你count1會高於預期。

移動for循環之間的最後一個大括號,它們將被取消。這應該減少返回的數量,以便您的測試通過。

3

這是因爲您有一個for循環,您不需要。既if S的關係進入同一環,這樣的:

for (int i = 0; i < s.length(); i++) { 
    if (s.charAt(i) == c) { 
     count = count + 1; 
    } 
    if (s.charAt(i) == d) { 
     count1 = count1 + 1; 
    } 
} 

既然這樣,的d字符的數目是由字符串的長度相乘,產生2 + 4 * 2 = 10。

如果您將count = count+1替換爲等效的count++,則可以使您的代碼更加通用於該語言。無論如何,你還可以完全放棄count1,因爲你在最後加上了兩個數字。

+1

'i1'從哪裏來? – Ascalonian 2015-02-05 21:43:48

+0

爲什麼他還應該使用'count1'? :D只是總是增加count而不是。 – Tom 2015-02-05 21:44:54

+0

@Tom我認爲保留兩個計數是可以的,以防他想在調試器中看到結果,或將它們記錄爲追蹤目的。但是你是對的,在這裏「數」已經足夠了。 – dasblinkenlight 2015-02-05 21:46:07

相關問題