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.姓名。是。阿农。是。阿诺。”应该是

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

要比较生成的icetagcodes。

如果您不希望输出中的重复项,则可以在循环之前将令牌添加到String

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

这意味着您比较两个对象,它们必须是内存中完全相同的引用,而不是完全相同。您正在寻找的是两个相同的物体。为此,您必须将对象与 .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