String Tokenizer en Java donne un résultat erroné.Besoin d'aide (probablement une solution simple)
-
21-12-2019 - |
Question
Mon code consiste essentiellement à trouver le nombre de mots dans une chaîne (oui, c'est très simple, mais ça ne fonctionne pas).J'ai essayé plusieurs méthodes et essayé de modifier le code plusieurs fois.Quelqu'un peut-il m'expliquer pourquoi ce code ne fonctionne pas et s'il est possible de me donner un code meilleur/fonctionnel.
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);
}
La sortie requise pour « My.Nom.Est.Anon.Est.Anon." devrait être
My 1
Name 1
Is 2
Anon 2
But I get
My 1
Name 1
Is 1
Anon 1
Is 1
Anon 1
J'ai le sentiment qu'il y a une erreur évidente ici mais je ne la vois tout simplement pas (besoin de nouveaux yeux >.>)
La solution
Votre erreur est ici :
if(k==mspace[x])
Vous devez utiliser
if (k.equals(mspace[x]))
comparer String
s.
Si vous ne voulez pas de doublons dans la sortie, vous pouvez ajouter vos jetons à un Set
avant la boucle :
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);
}
Autres conseils
comparaison des chaînes
remplacer
if(k==mspace[x])
{
freq++;
}
avec
if(k.equals(mspace[x]))
{
freq++;
}
Tu as cette ligne :
if(k==mspace[x])
Cela signifie que vous comparez deux objets et qu’ils doivent avoir exactement la même référence en mémoire, et non identiques.Ce que vous recherchez, ce sont deux objets identiques.Pour ce faire, vous devez comparer des objets avec .equals(Object)
.
if (k.equals(mspace[x]))
Juste pour ajouter aux autres réponses ici, je pense que vous devez également supprimer des doublons de la liste ou vos résultats seront comme:
My 1
Name 1
Is 2
Anon 2
Is 2
Anon 2
Donc, votre IF-Block devrait être:
for(int i=0;i<nToken;i++)
{
String k = mspace[i];
if (k.equals(""))
continue;
int freq = 0;
for(int x=0;x<nTokenSpace;x++)
{
if(k.equals(mspace[x]) )
{
freq++;
mspace[x] = "";
}
}
System.out.println(k+"\t"+freq);
}
Pourquoi n'utilisez-vous pas de classes de collecte?Voici le code.
import java.io.*;
import java.util.*;
public class HelloWorld{
public static void main(String []args)
{
String givenstring="My. Name. Is. Anon. Is. Anon.";
String[] words=givenstring.split(" ");
ArrayList<String> arr=new ArrayList<String>();
for(int i=0;i<words.length;i++)
arr.add(words[i]);
while(arr.size()!=0)
{
String word=arr.get(0);
int frequency=Collections.frequency(arr,word);
arr.removeAll(Collections.singleton(word));
System.out.println(word+frequency);
}
}
}
J'espère que cela aide ..