String Tokenizer en Java donne un résultat erroné.Besoin d'aide (probablement une solution simple)

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

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 >.>)

Était-ce utile?

La solution

Votre erreur est ici :

if(k==mspace[x])

Vous devez utiliser

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

comparer Strings.

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 ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top