Я студент CS210, и мне не удается проверить текстовый файл на наличие нескольких имен, чтобы извлечь из него данные. Мне даны следующие данные для хранения в текстовом файле. Это имя, за которым следуют 11 целых чисел, из которых следует считывать данные:
-Sally 0 0 0 0 0 0 0 0 0 0 886
-Sam 58 69 99 131 168 236 278 380 467 408 466
-Samantha 0 0 0 0 0 0 272 107 26 5 7
-Samir 0 0 0 0 0 0 0 0 920 0 798
Следующий код хорошо работает для первого имени в группе (Салли) и работает правильно. Но ведь программа ничего не возвращает в консоль для Сэма, Саманты или Самира. Я не уверен, почему для одного он будет работать правильно, а для других - нет.
import java.util.*;
import java.io.*;
public class TestSpace1 {
public static void main(String[] args) throws FileNotFoundException{
Scanner fileInput = new Scanner(new File("names.txt"));
String nameUsed = nameSearch();
dataScan(fileInput, nameUsed);
}
public static void dataScan(Scanner file, String name) {
String nameCheck = file.next();
try{
// While there are still tokens to be read in the file
while(!name.equals(file.next())) {
while(file.hasNext()) {
// If the name is equal to the next String token in the file
if (nameCheck.equals(name)) {
// Initialize variable to contain start year
int year = 1910;
// Run through for loop to add up the integers and display them in value pairs for the year
for (int i = 0; i < 11; i++) {
int ranking = file.nextInt();
System.out.println(year + ": " + ranking);
year += 10;
}
// If the file doesn't read the name, loop to the end of the line, start at top of loop
} else {
file.nextLine();
}
}
}
// If there is a line out of bounds, catch exception
} catch (Exception e) {
System.out.println("All lines have been read");
}
}
public static String nameSearch() {
Scanner input = new Scanner(System.in);
System.out.println("This program allows you to search through the");
System.out.println("data from the Social Security Administration");
System.out.println("to see how popular a particular name has been");
System.out.println("since 1900.");
System.out.print("What name would you like to search? ");
String name = input.nextLine();
return name;
}
}
Привет, спасибо за быстрый ответ! Итак, если я правильно это понимаю, while (file.hasNext ()) возвращает логическое значение. Итак, как только он просматривает файл один раз, он возвращает false в конце и прерывает цикл? Скажем, я ввожу «Сэм» в качестве ввода, разве сканер не должен читать первую строку, видеть, что она не совпадает, и читать строку за строкой, пока не найдет «Сэм»? Я думаю, я не понимаю, почему он не проверяет начальную точку (или как я могу проверить первый токен в каждой строке), чтобы узнать, равен ли мой ввод этому токену. Огромное спасибо!




Проблема в том, что nameCheck не обновляется до следующего токена в файле. Вам нужно переместить nameCheck внутрь цикла while, чтобы он изменял каждый цикл. Также вам не нужен while(!name.equals(file.next()))), потому что тогда, если совпадение имени будет file.next, цикл просто завершится вместо вычисления суммы целых чисел. Код работает для первого, потому что он первый в списке, поэтому nameCheck не нужно обновлять, а file.next () будет следующим, а не первым. Ваш код должен выглядеть примерно так:
try{
while(file.hasNext()){
String nameCheck = file.next();
if (nameCheck.equals(name)){
//code for calculating sum
}
}
}
Боже мой, перемещение nameCheck внутри цикла, чтобы обновления работали как шарм. Спасибо за ценную информацию - не могу поверить, что все свелось к чему-то настолько простому!
У вас нет операторов
breakилиcontinue, поэтому, как вы думаете, когда закончится циклwhile(file.hasNext())? Итак, как только он закончится, то естьfile.hasNext()вернул false, что, по вашему мнению, произойдет, когда условие внешнего цикла вызываетfile.next()? Если вы думаете, что это не сработает сNoSuchElementException, вы были бы правы, поэтому внешний цикл либо сразу пропустится, либо будет повторяться один раз, а затем умрет! Вы бы знали об этом, если бы не отбросили исключение. Не отбрасывайте исключения.