2017-09-14 59 views
0

我有這個問題:我需要在字符串中打印重複的字符。 現在,如果你看我的代碼,沒有在循環結束時返回,我會得到正確的算法。但是如果我把char作爲返回值,第二個循環會在結束之前熄滅。是否有必要在使用Junit TDD的方法中返回?

是否有必要在要測試的程序中獲得回報?

這是代碼:

 int[] letters = new int[26]; 
     for (int i = 0; i < s.length(); i++) { 
      letters[s.charAt(i) - 97]++; 
     } 
     for (int i = 0; i < letters.length; i++) { 
      if (letters[i] > 1) { 
       char c = (char) (i + 97); 
       System.out.println(c); 
       //return c; 
      } 
     } 
+0

在那裏添加返回會讓你的方法做錯誤的事情。因此,測試將會中斷。 – SLaks

+0

爲了正確的可測試性,您應該將邏輯(需要測試的)與不可測試的副作用(打印)分開。 – SLaks

+1

您可以將char添加到數組並在最後返回數組。它會保持方法的可測性,並且可以打印出可以得到相同結果的數組。 –

回答

2

基於代碼和註釋已經離開了,這裏是我的建議。

int[] letters = new int[26]; 
for (int i = 0; i < s.length(); i++) { 
    letters[s.charAt(i) - 97]++; 
} 
char[] copyLoop = new char[26]; 

for (int i = 0; i < letters.length; i++) { 
    if (letters[i] > 1) { 
     char c = (char) (i + 97); 
     copyLoop[i] = c;    
    } 
} 
return copyLoop; 

您的評論給自己呈現以下...

for (int i = 0; i < letters.length; i++) 
{ 
    if (letters[i] > 1) 
    { 
     char c = (char) (i + 97); 
     char[] copyLoop = new char[26]; 
     copyLoop[c]++; 
    } 
} 

的這個問題是,你聲明一個新的字符數組,每次你進入循環。在循環外聲明它並將值添加到數組中。然後返回數組。

根據下面對這個答案的評論,這裏是單元測試。

@Test public void test1() 
{ 
    char [] result = c.checkDouble("casa"); 
    Assert.assertEquals("a", String.valueOf(result[0])); 
} 

我又不能強調不夠我以前的評論

那一個是你。設置一個斷點並調試測試。查看結果的值並對「al」與結果進行手動比較。請記住,「al」是一個字符串,你正在返回一個字符數組。

有幾件事情要記住...

  1. 設置測試方法一個破發點。逐步完成該方法,並在到達Assert一行時停止。將鼠標懸停或設置爲查看結果的值。這樣做可以很容易地解決這個問題。
  2. 你會發現當你這樣做時result是一個array,你試圖將它與char進行比較。現在,您在數組中有chars的結果,但您需要使用index訪問陣列。
+0

謝謝你的代碼,但它給我一個返回錯誤: return copyLoop []; 的方法是:public char [] checkDouble(String s) – InExperience

+1

爲了將來的參考,請將方法代碼全部放在問題中。將其修改爲最低限度。有關更多詳細信息,請參閱https://stackoverflow.com/help/how-to-ask。請參閱我的回答中更新的代碼 –

+0

爲什麼會失敗? '@Test \t public void test1(){ \t \t char [] result = c.checkDouble(「wallaby」); \t \t Assert.assertEquals(「al」,result); \t}' – InExperience

相關問題