String Tokenizer в Java выдает неверный результат.Нужна помощь (вероятно, простое решение)
-
21-12-2019 - |
Вопрос
Мой код в основном предназначен для определения количества слов в строке (да, очень просто, но он не работает).Я пробовал несколько методов и несколько раз пытался изменить код.Может ли кто-нибудь объяснить мне, почему этот код не работает, и можно ли дать мне лучший/рабочий код.
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]))
сравнивать String
с.
Если вы не хотите, чтобы в выводе были дубликаты, вы можете добавить свои токены в 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
.
Так что ваш если-блок должен быть:
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);
}
}
}
.
Надеюсь, это поможет ..