#java
#java
Вопрос:
Я работаю над проектом, в котором много разных частей и методов. Для этой конкретной части мне нужно запросить у пользователя имя файла, который содержит набор слов, по одному в строке. (см. прикрепленный) Затем мне нужно вычислить среднюю оценку / настроение слова, сравнив его с файлом movieReview, который оценивает настроение слов. (см. прикрепленный)
[Редактировать] : я не получил свой код, чтобы взять первую строку файла списка слов, выполнить поиск по слову в файле movieReview и найти среднюю оценку слова. И после завершения поиска перейдите к следующему слову. Однако для остальных слов после первого, «механического», печатается NaN
Пример: Первое слово в файле списка слов — «механический». Mechanical встречается в файле movieReview 6 раз, и общая оценка равна 4. Среднее значение тональности для слова «механический» равно .666666666.
Как я могу сделать свой код таким, чтобы цикл продолжался, находил среднее значение для каждого отдельного слова и распечатывал его? Извините, если это звучит непонятно, дайте мне знать, если мне нужно уточнить. Кроме того, я очень начинающий программист, поэтому, пожалуйста, постарайтесь не использовать сложные концепции. (Также было сказано, что использование массива или буфера не требуется)
Файл рецензии на фильм: http://nifty.stanford.edu/2016/manley-urness-movie-review-sentiment/movieReviews.txt
Содержимое файла списка слов (txt): механический автомобиль, бездушный стиль, семья, замечательная история, ни сильный фарс, сложный, вызывающий интерес актерский состав, остроумный, с приглушенным чувством, повествование, освежающее, нравоучительное, ужасный, решительно ужасный диалог, бессвязный расход слов, движущийся, лишенный снисходительной скучной ценности, рассказ о собаке, почти всегда расфокусированный, шаблонный, эксцентричный, изворотливый, непредсказуемый, написание со слезами
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class methodThree {
public static void main (String [] args) throws FileNotFoundException {
Scanner in = new Scanner(System.in);
System.out.println("Enter the name of the file with words you want to score: ");
String inputFileName = in.next();
File inputFile = new File(inputFileName);
while(!inputFile.exists())
{
System.out.println("Please enter a valid file name:");
inputFile = new File(in.next());
}
Scanner wordFile = new Scanner (inputFile);
File inputMovie = new File("movieReviews.txt");
Scanner movieReview = new Scanner (inputMovie);
String reviewText;
int reviewScore;
while (wordFile.hasNextLine())
{
int count = 0;
double total = 0;
String word = wordFile.nextLine();
while (movieReview.hasNext()) {
reviewScore = movieReview.nextInt();
reviewText = movieReview.nextLine();
if (reviewText.contains(word)) {
count ;
total = total reviewScore;
}
}
double average = (total / count);
System.out.println (word " " average);
}
}
}
Ответ №1:
Итак, что вы в основном хотите сделать, это повторить этот код для каждой строки в wordfile?
int count = 0;
double total = 0;
String word = wordFile.nextLine();
while(movieReview.hasNext()){
reviewScore = movieReview.nextInt();
reviewText = movieReview.nextLine();
if (reviewText.contains(word)) {
count ;
total = total reviewScore;
}
}
double average = (total / count);
System.out.println(average);
в этом случае вы могли бы окружить его другим циклом while. Цикл должен выполняться для каждой строки в WordFile, так что это более или менее тот же цикл, что и ваш цикл movieReview.hasNext().
while(wordFile.hasNext()){
int count = 0;
...
}
Цикл выполняется до тех пор, пока в WordFile есть другое слово для оценки.
Комментарии:
1. Да, это концепция, которой я пытаюсь достичь! Однако этот код сработал для первого слова, mechanical, но затем вернул NaN для остальных слов.
2. @A.Hodges затем вы должны опубликовать (отредактировать свой вопрос) свой код, который зацикливается на файле WORD, и мы можем попытаться найти ошибку.
3. @A.Hodges ах, поскольку он возвращает NaN, вы, скорее всего, делите на 0 или что-то в этом роде. Вы должны спросить, является ли (count> 0) перед выполнением двойного среднего значения = (total / count);
4. Понял, спасибо! Я обновил свой код в сообщении. Я также пытался использовать оператор if, чтобы избежать NaN, но это вернуло к исходной проблеме отсутствия публикации средних значений для остальных слов.
5. Ах да, ваш сканер movieReview выполняется один раз над файлом (для первого слова), и после этого сканер не сбрасывается (ваша программа считывает файл рецензии только один раз, но он должен считывать файл рецензии для каждого слова). Самый простой способ решить эту проблему — добавить Scanner movieReview в цикл while (если это не сработает, попробуйте также поместить файл inputMovie внутрь цикла). (Информация: Чтение файла снова и снова — плохое решение. Но поскольку вы новичок в Java, это совершенно нормально, и более простые решения важнее хороших)