2017-11-18 2 views
0

Ich muss die Anzahl der Wörter in einer Zeichenfolge, die genau N-mal wiederholt werden?String-Word-Counter

Beispiel:

eins zwei drei vier drei zwei fünf

Ausgang: 3

da eins, vier und fünf erscheint nur einmal.

Mein Code zeigt mir die Ausgabe als 1.

was mit meinem Code und Logik falsch ist? Danke.

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

ich durch Linie mit einem Debugger für Zeile empfehlen treten. – notyou

+0

Sie setzen 'i' Variable nie zurück. –

Antwort

1

Ich sehe drei Gründe, die Ihr Ergebnis falsch macht.

Erste ist c Wenn ein Wort nur einmal hier ist, dann ist die if Aussage if(b.equalsIgnoreCase(a[j])) wird nie der Fall sein. Was bedeutet, dass c auf 0 immer gleich sein wird, also Sie Sie 1 als Standardwert für c oder Sie sollten den Wert von c überprüfen mit der folgenden Anweisung if (n == c + 1)

Der zweite Punkt ist verwenden müssen, dass Sie die Reset sollte Wert von c auch wenn es gleich n ist.

Dann mit dieser Doppel-for-Schleife:

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

Wenn Sie für einen Wert zu suchen, die es nur einmal ist, das letzte Vorkommen der einzelnen Wörter werden auch gezählt. Es gibt viele Möglichkeiten, das zu lösen. Eine davon ist die Verwendung eines Set<String> und zählt nur für die Wörter, die vorher nicht verwendet wurden.

So am Ende werden Sie etwas ähnlich wie haben:

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

Ich denke, es ist, weil Sie nicht C initiieren, wenn n == c. Daher erhöht es sich auf 1, nachdem eins und eins übereinstimmen. Und es funktioniert nicht gut. Es sollte für jede Schleife 0 sein Auch warum j beginnt von i + 1? Nach jeder Schleife wird der Vergleich eins nach dem anderen verloren gehen, da a [j] kleiner wird. Es sollte immer eine Liste der vollständigen Eingangsnummern enthalten