Частота подсчета строки

По сути, я хочу искать частоту строки. Например, если я передаю слово "я", то частота этого слова в следующем предложении: "я пошла на пляж и я увидела трех человек" должно быть 2. Я построил такой метод, в котором я беру текст (любой длины), разбиваю его на массив пробелами и перебираю массив, ища, соответствует ли каждый индекс слову. Затем я увеличиваю счетчик частоты и возвращаю число в виде строки. Вот метод:

private int freq() {
String text = "I went to the beach and I saw three people";
String search = "I";
String[] splitter = text.split("\\s+");
int counter = 0;
   for (int i=0; i<splitter.length; i++)
   {
       if (splitter[i]==search) 
       {
           counter++;
       }
       else
       {

       }
   }
   return counter;
       }

}  

Это вне метода:

String final = Integer.toString(freq());
System.out.println(final);

Но когда я запускаю это, я продолжаю получать 0 в результате. Я не знаю, что я делаю неправильно.

РЕДАКТИРОВАТЬ: Вы все правы! Какой пустой вопрос :(.


person Macosx Iam    schedule 20.10.2011    source источник
comment
У вас получился хороший HashMap :) Серьезно, знание основных структур данных и того, когда их использовать, очень важно.   -  person Jeff Ferland    schedule 20.10.2011


Ответы (7)


Используйте equals вместо ==

if (text[i].equals(search) )
   {
       counter++;
   }

лучшее решение

Используйте карту, чтобы сопоставить слова Map<String,Integer> с частотой.

String [] words = line.split(" ");

Map<String,Integer> frequency = new HashMap<String,Integer>();

for (String word:words){

    Integer f = frequency.get(word);
    //checking null
    if(f==null) f=0;
    frequency.put(word,f+1);
}

Затем вы можете узнать конкретное слово с помощью:

frequency.get(word)
person gtiwari333    schedule 20.10.2011
comment
Я начал писать комментарий об использовании времени журнала (N), а затем понял, что карта была создана как интерфейс (не работает). Я изменил это на конкретный тип. Двумя распространенными реализациями Map являются TreeMap и HashMap. TreeMap занимает время log(N), но вы можете все отсортировать. HashMap даст вам вставку O (1) и поиск O (1). - person Jeff Ferland; 20.10.2011

Используйте метод equals() для сравнения строк.

if(text[i].equals(search))
{
   counter++;
}
person kv-prajapati    schedule 20.10.2011
comment
Я думаю, что его логика тоже неверна! он / она должен проходить через сплиттер, а не через текст :) - person TeaCupApp; 20.10.2011
comment
это была опечатка. Я прохожу через сплиттер - person Macosx Iam; 20.10.2011

Чтобы ваш код работал, следуйте другим ответам, используйте .equals вместо ==, но вы также можете использовать apache commons lang:

StringUtils.countMatches(text, search);

http://commons.apache.org/lang/ http://commons.apache.org/ lang/apidocs/org/apache/commons/lang3/StringUtils.html#countMatches(java.lang.CharSequence, java.lang.CharSequence)

person brcosta    schedule 20.10.2011

Строки следует сравнивать с String.equals, а не ==, который проверяет, являются ли они одним и тем же объектом, а не имеют ли они одинаковое содержимое.

person Dave Newton    schedule 20.10.2011

Чтобы сравнить два String, вы должны использовать метод equals(), а не простой ==

person talnicolas    schedule 20.10.2011

Вы можете использовать карту, чтобы поместить слово в качестве ключа и частоту слова в качестве значения. Затем внутри цикла попробуйте использовать блок try-catch, чтобы добавить +1 к клавише, связанной с текущим словом (tryblock), если слово не найдено, «fdist.get(w)» выдаст исключение nullpointer, затем поймайте, просто поставив 1 для значения.

Map<String,Integer> fdist = new HashMap<String,Integer>();
for(String w:s.split(" ")){
    try {
        fdist.put(word, fdist.get(w)+1);
    } catch (Exception e) {
        fdist.put(word, 1);
    }
}
person wingedcrown    schedule 07.10.2014
comment
Ваш ответ должен содержать объяснение вашего кода и описание того, как он решает проблему. - person AbcAeffchen; 07.10.2014

Определить частоту слов в файле.
Это базовый код для hashmap в Java.

File f = new File(fileName);
 Scanner s = new Scanner(f);
   Map<String, Integer> counts =
  new Map<String, Integer>();
      while( s.hasNext() ){
 String word = s.next();
 if( !counts.containsKey( word ) )
 counts.put( word, 1 );
else
 counts.put( word, 
    counts.get(word) + 1 ); 
}
person Jitendra    schedule 08.02.2017