Javaの文字列トークナイザーは間違った出力を与えます。助けが必要です(おそらく簡単な解決策)

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

質問

私のコードは基本的に文字列内の単語数を見つけるためのものです(ええ、本当に単純ですが、働いていません)。 私は複数の方法を試してみました、そして、コードを数回変更しようとしました。 誰かがこのコードがうまくいかない理由を説明し、それが私に良い/作業コードを与えることが可能であるならば。

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

"My。名前です。anonです。anonです。"

であるべきです
My  1
Name 1
Is 2
Anon 2

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

ここで明らかな間違いがあると感じていますが、私はそれを見てはいけない(新しい目>。>)

役に立ちましたか?

解決

あなたのエラーはここにあります:

if(k==mspace[x])
.

を使う必要があります
if (k.equals(mspace[x]))
.

Stringsを比較します。

出力に重複が必要な場合は、ループの前にSetにトークンを追加できます。

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

他のヒント

弦の比較

を交換します
 if(k==mspace[x])
       {
           freq++;
        }
.

 if(k.equals(mspace[x]))
       {
           freq++;
        }
.

この行を持っています:

if(k==mspace[x])
.

これは、2つのオブジェクトを比較することを意味し、それらはメモリ内で正確に同じ参照でなければならないことを意味します。あなたが探しているのは2つの同一のものです。そのためには、オブジェクトを.equals(Object)と比較する必要があります。

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

ここで他の答えに追加するために、私はリストから重複も削除する必要があると思います。

My  1
Name    1
Is  2
Anon    2
Is  2
Anon    2
.

だからあなたのIF-BLOCKは次のようにするべきです:

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

コレクションクラスを使用しないのはなぜですか。これがコードです。

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

それが役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top