2017-11-18 169 views
0

我必須打印一個字符串中的字數統計N次?字符串字計數器

例如:

一二三四三兩個五

輸出:3

由於一個,四和五隻出現一次。

我的代碼顯示我的輸出爲1

什麼是錯我的代碼和邏輯?謝謝。

import java.util.*; 
public class Hello { 

    public static void main(String[] args) { 
     Scanner scan=new Scanner(System.in); 
     String s=scan.nextLine(),b; 
     int n=scan.nextInt(); 
     int c=0,f=0,i; 
     String[] a=s.split(" "); 
     for(i=0;i<a.length;i++) 
     { 
      b=a[i]; 
      for(int j=i+1;j<a.length;j++) 
      { 
      if(b.equalsIgnoreCase(a[j])) 
      { 
       c++; 
      } 

      } 
      if(n==c) 
      { 
       f++; 
      } 
      else 
      { 
       c=0; 

      } 
     } 
     System.out.print(f); 

    } 
} 
+2

我建議通過它符合一個調試器步進一行。 – notyou

+0

你永遠不會重置'i'變量。 –

回答

1

我看到三個原因導致您的結果不正確。

第一個是c 如果一個字在這裏只有一次,那麼if聲明if(b.equalsIgnoreCase(a[j]))永遠不會爲真。這意味着c將永遠等於0 所以,你需要使用1作爲默認值c還是應該使用下面的語句if (n == c + 1)

第二點是,你應該重新設置檢查c值值爲c,即使它等於n

然後用這雙for循環:

for (i = 0; i < a.length; i++) { 
    b = a[i]; 
    for (int j = i + 1; j < a.length; j++) { 

當你尋找這是一個值。有一次而已,每一個單詞的最後一個實例也會被計算在內。 有很多方法可以解決這個問題。其中之一是使用Set<String>,只計算以前沒有使用過的詞。

所以最終你將有類似的東西:

int c=1,f=0,i; 
String[] a=s.split(" "); 
Set<String> words = new HashSet<>(); 
for (i = 0; i < a.length; i++) { 
    b = a[i]; 
    if (words.add(b)) { 
    for (int j = i + 1; j < a.length; j++) { 
     if (b.equalsIgnoreCase(a[j])) { 
     c++; 
     } 
    } 
    if (n == c) { 
     f++; 
    } 
    c = 1; 
    } 
} 
0

我想這是因爲當n == c時你不初始化C。因此它在一個和一個匹配後增加到1。它運作不好。它應該爲0每個循環 也爲什麼j從i + 1開始?每個循環後,它會逐一失去比較自[j]越來越小。它應該始終包含完整輸入號碼列表