Почему моя программа не распознает все имена из текстового файла?

Я студент 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;
}

}

У вас нет операторов break или continue, поэтому, как вы думаете, когда закончится цикл while(file.hasNext())? Итак, как только он закончится, то есть file.hasNext() вернул false, что, по вашему мнению, произойдет, когда условие внешнего цикла вызывает file.next()? Если вы думаете, что это не сработает с NoSuchElementException, вы были бы правы, поэтому внешний цикл либо сразу пропустится, либо будет повторяться один раз, а затем умрет! Вы бы знали об этом, если бы не отбросили исключение. Не отбрасывайте исключения.

Andreas 19.05.2018 23:45

Привет, спасибо за быстрый ответ! Итак, если я правильно это понимаю, while (file.hasNext ()) возвращает логическое значение. Итак, как только он просматривает файл один раз, он возвращает false в конце и прерывает цикл? Скажем, я ввожу «Сэм» в качестве ввода, разве сканер не должен читать первую строку, видеть, что она не совпадает, и читать строку за строкой, пока не найдет «Сэм»? Я думаю, я не понимаю, почему он не проверяет начальную точку (или как я могу проверить первый токен в каждой строке), чтобы узнать, равен ли мой ввод этому токену. Огромное спасибо!

dat_cube 19.05.2018 23:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что 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 внутри цикла, чтобы обновления работали как шарм. Спасибо за ценную информацию - не могу поверить, что все свелось к чему-то настолько простому!

dat_cube 20.05.2018 02:07

Другие вопросы по теме