String-Tokenizer in Java gibt falsche Ausgabe aus.Brauche Hilfe (wahrscheinlich eine einfache Lösung)

StackOverflow https://stackoverflow.com//questions/22016805

Frage

Mein Code besteht im Grunde darin, die Anzahl der Wörter in einer Zeichenfolge zu ermitteln (ja, wirklich einfach, aber es funktioniert nicht).Ich habe mehrere Methoden ausprobiert und einige Male versucht, den Code zu ändern.Kann mir jemand erklären, warum dieser Code nicht funktioniert und ob es möglich ist, mir einen besseren / funktionierenden Code zu geben.

 StringTokenizer stspace = new StringTokenizer(sent, " .?");
    int nTokenSpace = stspace.countTokens();



    String mspace[] = new String[nTokenSpace];


    for(int i=0;i<nTokenSpace;i++)
    {
        mspace[i] = stspace.nextToken();


    }
  for(int i=0;i<nToken;i++)
    {
       String k = mspace[i];
       int freq = 0;
       for(int x=0;x<nTokenSpace;x++)
       {
           if(k==mspace[x])
           {
               freq++;
            }
        }
        System.out.println(k+"\t"+freq);
    }

Die erforderliche Ausgabe für "Mein.Name.Is.Anon.Is.Anon." sollte sein

My  1
Name 1
Is 2
Anon 2

But I get 
My  1
Name    1
Is  1
Anon    1
Is  1
Anon    1

Ich habe das Gefühl, dass hier ein offensichtlicher Fehler vorliegt, aber ich sehe ihn einfach nicht (brauche neue Augen>.>)

War es hilfreich?

Lösung

Dein Fehler ist hier:

if(k==mspace[x])

Sie müssen verwenden

if (k.equals(mspace[x]))

vergleichen Strings.

Wenn Sie die Duplikate nicht in der Ausgabe haben möchten, können Sie Ihre Token einem hinzufügen Set vor der Schleife:

Set<String> uniqueTokens = new LinkedHashSet<String>(Arrays.asList(mspace));
for (String k : uniqueTokens) {
    int freq = 0;
    for (int x = 0; x < nTokenSpace; x++) {
        if (k.equals(mspace[x])) {
            freq++;
        }
    }
    System.out.println(k + "\t" + freq);
}

Andere Tipps

Vergleich von Saiten

Ersetzen Sie

generasacodicetagpre.

mit

generasacodicetagpre.

Sie haben diese Zeile:

generasacodicetagpre.

Dies bedeutet, dass Sie zwei Objekte vergleichen, und sie müssen genau die gleiche Bezugnahme im Speicher sein, nicht identisch.Was Sie suchen, ist zwei identische Objekte.Um dies zu tun, müssen Sie Objekte mit dem generationspflichtigen Vergleichen vergleichen.

generasacodicetagpre.

Nur um die anderen Antworten hier hinzuzufügen, glaube ich, dass Sie auch Duplikate aus der Liste entfernen müssen, oder Ihre Ergebnisse sind wie:

generasacodicetagpre.

Ihr IF-Block sollte also sein:

generasacodicetagpre.

Warum verwenden Sie keine Sammelklassen.Hier ist der Code.

generasacodicetagpre.

hoffe es hilft ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top