Java의 String Tokenizer가 잘못된 출력을 제공합니다.도움이 필요합니다(아마도 쉬운 해결책일 것입니다).

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

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

즉, 두 개체를 비교하면 메모리에서 동일하지 않고 정확히 동일한 참조여야 합니다.당신이 찾고 있는 것은 두 개의 동일한 개체입니다.그러기 위해서는 객체를 다음과 비교해야 합니다. .equals(Object).

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

여기에 다른 답변에 추가하기 위해서는 목록에서 중복을 제거해야합니다.

다음과 같습니다.
My  1
Name    1
Is  2
Anon    2
Is  2
Anon    2
.

이면 if 블록이 있어야합니다 :

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