2016-03-24 66 views
1
public Object countOccurrences(String string) 
{ 
    int e = 0; 
    int i = 0; 
    while (i < sentence.length()) 
    { 
     if(sentence.contains(string)) 
     { 
      e++; 
      i++; 
      return e; 
     } 
     else 
     { 
      break; 
     } 
    } 
    return e; 
} 

我的代碼有什麼問題不會讓我通過測試?無論如何,我可以使用循環內的子串方法來做到這一點?如何查找在字符串中使用子串的次數?

@Test 
public void testCountOccurrences() 
{ 
    assertEquals(1, sc1.countOccurrences("ence")); 
    assertEquals(2, sc1.countOccurrences("en")); 
    assertEquals(1, sc2.countOccurrences("that")); 
    assertEquals(0, sc2.countOccurrences("This")); 

} 
+0

我建議使用模式/匹配器: 請參閱示例: http://stackoverflow.com/questions/7378451/java-regex-match-count –

回答

7

什麼是錯我的代碼,將不會允許我通過測試?

在做其他事情之前,你應該考慮如何解決你的代碼開始時出了什麼問題。你通過它進行了調試嗎?它在什麼時候表現出與你預期的不同?如果你還沒有學會如何使用調試器,現在是開始的好時機。

至於下一步,看一下這個代碼:

if(sentence.contains(string)) 
{ 
    e++; 
    i++; 
    return e; 
} 

這個條件不依賴於ie,只是sentencestring。所以只要sentence是長度至少爲1的,你要麼返回1或0。您的代碼,永遠無法返回大於1

而這正是你的代碼錯誤的時刻 - 至於如何修復它,我會開始尋找String.indexOf(String, int)。也就是說,要查找第一個匹配項,然後找到下一個的情況,然後發現下一個,直到找不到更多。 (使用返回值的工作從哪裏開始找上了下一次迭代,以及檢查,有一個比賽。)

一對夫婦的情況下,要小心:

  • 多少次「abbbc」是否包含「bb」?
  • 「abbbc」包含「」多少次?

我還敦促其他幾個變化:

  • 你的方法有Object返回類型 - 爲什麼?當然它總是會返回一個整數,所以返回類型int會更合適
  • 這是參數化測試的絕佳選擇。研究如何將單個測試有效地分離爲可以獨立通過或失敗的多個測試用例,但沒有大量測試方法的源代碼開銷......(提示:每個測試用例都應該有句子,文本尋找和匹配的預期數。)
0
public Object countOccurrences(String string) { 
    int e = 0; 
    int i = 0; 
    while (i <= (sentence.length() - string.length() + 1)) { 
     if (sentence.substr(i, string.length() - 1).equals(string)) { 
      e++; 
     } 


     i++; 
    } 
    return e; 
} 

我沒有得到自己試試吧,但它應該工作。

相關問題