2017-11-18 178 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]越来越小。它应该始终包含完整输入号码列表