Как определить количество слов длиной более трех в данном файле и записать

#java

#java

Вопрос:

Я пытаюсь выполнить поиск по заданному текстовому документу. для слов длиной 3 или более, а затем записать количество каждого и отобразить на экране. Я изложу то, что у меня есть на данный момент, ниже. Я столкнулся с проблемой поиска максимальной длины слов в документе. так что я знаю, когда нужно остановить запись. Кроме того, у меня возникли проблемы с возможной оптимизацией программы вместо того, чтобы запускать так много операторов if if-else.

С уважением!

 public static int WordLengthCount() throws FileNotFoundException {
File file = new File("document.txt");
Scanner keyboard = new Scanner(new FileInputStream(file));
    int count5 = 0;
    int count6 = 0;
    while (keyboard.hasNext()) {
        if (keyboard.next().length() == 5) {
            count5  ;
        }
        else if (keyboard.next().length() == 6) {
            count6  ;
}

}
return count5;
 

Комментарии:

1. 2, если утверждений не очень много; поскольку у вас есть 3 различных условия, которые нужно различать (длина = 5, длина = 6, длина не равна ни 5, ни 6), трудно уменьшить его еще больше. С другой стороны, вы не видите, как его использовать count6 , поэтому непонятно, зачем он вам нужен.

2. Возможно, используйте массив int и для любой длины> 2 do arr[word.length() - 3] , тогда у вас будет количество для каждого слова, где arr[0] количество слов с 3 буквами arr[1] равно 4 символам и т.д.

3. Я должен был бы добавить операторы if, равные максимальной длине слов в документе. т.е. count6, count7 … после нахождения самого длинного слова путем чтения документа или учета максимально возможной длины вручную.

4. обычно , когда вы обнаруживаете , что создаете переменные типа count1 , count2 , count3 … вам нужно начать изучать какую-то форму повторяющейся коллекции.

5. Я остановился на карте. Можете ли вы знать, как я могу получить доступ к данным в определенном месте (позиция, ключ?) в Map. ie на 1 карте, представляющей слова длиной три, количество слов этой длины равно 12000. Как мне получить доступ к этому числу, чтобы я мог найти частоту слов из 3 букв?

Ответ №1:

Вы вызываете .next() дважды в while цикле, так что на самом деле вы читаете 2 строки, а не одну, на каждой итерации. Вам нужно сохранить строку, возвращаемую by .next() , в переменной и проверить длину этой строки. Ваш первый if оператор считывает следующую строку в файле и проверяет ее длину, а второй else if — считывает строку после предыдущей строки и проверяет ее длину.

 while (keyboard.hasNext()) {
    final String next = keyboard.next();
    if (next.length() == 5) {
        count5  ;
    } else if (next.length() == 6) {
        count6  ;
    }
}
 

Если количество символов, которые вам нужно подсчитать, является динамическим, вы можете использовать Map .

 final Map<Integer, Integer> charCount = new HashMap<>();
//the key for this map is the length of the word and the value is the number of times a word with that length was found
while (keyboard.hasNext()) {
    final String next = keyboard.next();
    final Integer len = next.length();
    if(charCount.has(len){
       charCount.put(len, charCount.get(len) 1);
    } else {
       charCount.put(len, 1);
    }
}
//print the values
for(final Integer key: charCount.keySet()){
    System.out.println("A word with length "   key   " characters was found "  charCount.get(key)   " times.");
}
 

Ответ №2:

Если вы используете java 8 или выше, то это решение может вам помочь.

  • Используйте карту для хранения счетчиков (значений) для каждой длины (ключей)
  • Для любого слова с длиной > = 3 я использую merge для создания / обновления счетчика длины
  • Используйте поток для сортировки ключей и вывода длины и количества в порядке возрастания
  • Используйте поток и max метод, чтобы найти наибольшее значение для ключей, то есть самое длинное слово

 public static int wordLengthCount() throws FileNotFoundException {
    File file = new File("document.txt");
    Scanner keyboard = new Scanner(new FileInputStream(file));
    Map<Integer, Integer> wordLengths = new HashMap<>();
    while (keyboard.hasNext()) {
        String word = keyboard.next();
        Integer length = word.length();
        if (length >= 3) {
            wordLengths.merge(length, 1, Integer::sum);
        }
    }
    keyboard.close();

    wordLengths.keySet().stream().sorted(Comparator.naturalOrder()).forEach(key -> {
        System.out.printf("Word length %d occured %d timesn", key, wordLengths.get(key));
    });

    int maxLength = wordLengths.keySet().stream().max(Comparator.naturalOrder()).get();
    return maxLength;
}

public static void main(String[] args) throws Exception {
    System.out.println("Max length = "   wordLengthCount());
}