String-Tokenizer in Java gibt falsche Ausgabe aus.Brauche Hilfe (wahrscheinlich eine einfache Lösung)
-
21-12-2019 - |
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>.>)
Lösung
Dein Fehler ist hier:
if(k==mspace[x])
Sie müssen verwenden
if (k.equals(mspace[x]))
vergleichen String
s.
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 ..