как посчитать количество слов в строке

Я довольно новичок в java. Я хочу подсчитать количество слов в определенной строке. Пока я могу только считать слова, но не знаю, как считать вхождения.

Есть ли простой способ сделать это?

Scanner file = new Scanner(new FileInputStream("/../output.txt"));
int count = 0;
  while (file.hasNextLine()) {
    String s = file.nextLine();
    count++;    
      if(s.contains("#AVFC")){
       System.out.printf("There are %d words on this line ", s.split("\\s").length-1);
       System.out.println(count);   
      }

  }
file.close(); 

Выход:

    There are 4 words on this line 1

    There are 8 words on this line 13

    There are 3 words on this line 16

person JD14    schedule 10.03.2014    source источник


Ответы (5)


Самый простой способ, который я могу придумать, - это использовать String.split("\\s"), который будет разделяться на основе пробелов.

Затем используйте HashMap, содержащее слово в качестве ключа со значением, равным количеству раз, которое оно используется.

   HashMap<String, Integer> mapOfWords = new HashMap<String, Integer>();

      while (file.hasNextLine()) {
        String s = file.nextLine(); 
        String[] words = s.split("\\s");
        int count;
        for (String word : words) {
           if (mapOfWords.get(word) == null) {
              mapOfWords.put(word, 1);
           }
           else {
              count = mapOfWord.get(word);
              mapOfWords.put(word, count + 1);
           }
        }
      }

Реализация, которую вы просили пропустить строки, содержащие определенные слова

   HashMap<String, Integer> mapOfWords = new HashMap<String, Integer>();

   while (file.hasNextLine()) {
        String s = file.nextLine(); 
        String[] words = s.split("\\s");
        int count;

        if (isStringWanted(s) == false) {
           continue;  
        } 

        for (String word : words) {
           if (mapOfWords.get(word) == null) {
              mapOfWords.put(word, 1);
           }
           else {
              count = mapOfWord.get(word);
              mapOfWords.put(word, count + 1);
           }
        }
      }

private boolean isStringWanted(String s) {
    String[] checkStrings = new String[] {"chelsea", "Liverpool", "#LFC"};

    for (String check : checkString) {
        if (s.contains(check)) {
           return false;
        }
    }
    return true;
}
person Mason T.    schedule 10.03.2014
comment
да, я что-то слышал о хеш-карте, но понятия не имею, как ее кодировать, так как я новичок в этом. можно ли помочь с кодом? Благодарность - person JD14; 10.03.2014
comment
Невозможно использовать int для дженериков, нужно использовать Integer - person Mike B; 10.03.2014
comment
если я хочу подсчитать строки, содержащие определенную строку, как мне это сделать? см. мое редактирование, которое в настоящее время не работает - person JD14; 12.03.2014
comment
Метод @ JD14 String.contains() в библиотеке String решит это за вас. Вот ссылка docs.oracle.com/ javase/1.5.0/docs/api/java/lang/String.html - person Mason T.; 12.03.2014
comment
@NappaTheSaiyan Я пытался сказать, что если строка содержит слова, она должна получать строки, но все равно получаю ошибки - person JD14; 12.03.2014
comment
@NappaTheSaiyan Я получаю синтаксическую ошибку, говорящую ); ожидал. Я пытался сделать это: private String s = new String isStringWanted();{ но не работает - person JD14; 12.03.2014
comment
@ JD14 В этом утверждении есть три ошибки. 1: Строковый конструктор не принимает параметр boolean. 2 : isStringWanted(String s) требует ввода строки. 3: вам не хватает круглых скобок для вызова конструктора String. Наконец, я хотел бы добавить, что понятия не имею, почему вы пытались вызвать это утверждение. isStringWanted() проверяет, содержит ли строка из файла одно из ваших ключевых слов. - person Mason T.; 12.03.2014

Попробуйте приведенный ниже код, он может решить вашу проблему, кроме того, вы можете вызвать String.toLowerCase(), прежде чем поместить его в хэш-карту.

String line ="a a b b b b a q c c";
...
Map<String,Integer> map = new HashMap<String,Integer>();
Scanner scanner = new Scanner(line); 
while (scanner.hasNext()) {
    String s = scanner.next();
    Integer count = map.put(s,1); 
    if(count!=null) map.put(s,count + 1);
}
...
System.out.println(map);

Результат:

{b=4, c=2, q=1, a=3}
person Safrain    schedule 10.03.2014
comment
Я думаю, вы имели в виду map.put(s, count + 1)? - person Jay; 10.03.2014
comment
это работает большое спасибо. единственная проблема в том, что он считает только одну строку, и я хочу подсчитывать слова только в строках, содержащих #AVFC, как и мой код. любая помощь с этим, пожалуйста? - person JD14; 10.03.2014
comment
Работал!! большое спасибо за твою помощь. очень признателен - person JD14; 10.03.2014

Самым быстрым было бы сохранить разделенные данные в ArrayList, затем выполнить итерацию по вашему ArrayList и использовать [Collections.frequency] (http://www.tutorialspoint.com/java/util/collections_frequency.htm)

person Abiel Paltao    schedule 10.03.2014

Проверьте Multiset в Guava. Их описание начинается с 'The traditional Java idiom for e.g. counting how many times a word occurs in a document is something like:'. Вы найдете несколько фрагментов кода, как это сделать без MultiSet.

Кстати: если вы хотите подсчитать только количество слов в строке, почему бы просто не подсчитать пробелы? Вы можете использовать StringUtils из достояние апачей. Это намного лучше, чем создание массива разделенных частей. Также взгляните на их реализация.

int count = StringUtils.countMatches(string, " ");
person steffen    schedule 10.03.2014

В данном String вхождения данного String можно подсчитать с помощью String#indexOf(String, int) и через цикл

String haystack = "This is a string";
String needle = "i";
int index = 0;

while (index != -1) {
    index = haystack.indexOf(needle, index + 1);

    if (index != -1) {
        System.out.println(String.format("Found %s in %s at index %s.", needle, haystack, index));
    }
}
person Smutje    schedule 10.03.2014
comment
Похоже, что он просто найдет определенный символ в строке, он не будет вычислять частоту слова. - person Mike B; 10.03.2014
comment
Да, считать должен уметь любой человек с минимальным знанием Java. - person Smutje; 10.03.2014
comment
Это имеет смысл. он находит первый индекс искомой строки (игла) и продолжает оттуда до тех пор, пока не будет найдено ни одного вхождения. Не хватает только переменной count для хранения количества найденных экземпляров. - person 75inchpianist; 10.03.2014
comment
Так что это ужасный способ подсчета частоты слов в строке. Вы перебираете строку символ за символом один раз для каждого уникального слова в строке. Для длинной строки это будет много итераций. Похоже, лучший способ - разбить на пробелы, а затем подсчитать слова с помощью карты. - person Mike B; 10.03.2014
comment
Да, потому что при разделении по пробелам не нужно проходить строку спереди назад... - person Smutje; 10.03.2014