#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());
}