Нет такого исключения элемента для моей функции babyname - PullRequest
0 голосов
/ 11 декабря 2018

Это мой код:

import java.awt.*;
import java.util.*;
import java.io.*;

public class BabyNames
{
    public static int decades = 11;
    public static void main (String [] args) throws FileNotFoundException
    {      
        DrawingPanel panel = new DrawingPanel(550,560);        
        Graphics g = panel.getGraphics();
        panel.setBackground(Color.WHITE);
        String line = search();
        graph(g,line);
    }   

    public static String search() throws FileNotFoundException 
    {
        Scanner util = new Scanner(new File("names.txt"));     
        String line = "";
        String requestedName = name();
        String rankings = "";
        String rank = "";

        while (util.hasNextLine())
        {       
            line = util.nextLine();
            Scanner tracer = new Scanner(line);
            String name = tracer.next();
            if (name.equalsIgnoreCase(requestedName))
            {
                for (int x =1;x<=decades;x++)
                {
                    rank = tracer.next();
                    rankings+=rank+" ";
                }
            } 
            if (!util.hasNextLine())
            {
                System.out.print("no data");
                break;               
            }
        }        
        return rankings;
    }

    public static String name()
    {
        String requestName = "";
        Scanner console = new Scanner(System.in);
        System.out.println("Type a name: ");
        requestName = console.next();
        return requestName;
    }

    public static void graph(Graphics g,String rankings)
    {
        g.setColor(Color.YELLOW);
        g.fillRect(0,0,550,30);
        g.fillRect(0,530,550,30);
        g.setColor(Color.LIGHT_GRAY);

        for (int x = 0; x <= 11;x++)
        {
            g.drawLine(0+50*x,30,0+50*x,530);
        }

        for (int x = 0;x<=10;x++)
        {
            g.drawLine(0,30+50*x,550,30+50*x);
        }

        Scanner console = new Scanner(rankings);
        g.setColor(Color.RED);
        int position = 0;
        int firstRank = console.nextInt();
        int position2 = firstRank/2+30;

        for (int x = 0; x<=decades-1;x++)
        {
            int rank = console.nextInt();
            if (rank==0)
            {
                position=530;
            } 
            else 
            {
                position = rank/2+30;
            }
            g.drawLine(0+x*50-50,position2,0+x*50,position);
            position2 = position;
        }
    }

}

Код запрашивает имя, затем ищет это имя в файле и затем отображает рейтинг в другом окне.

Файлотформатирован так:

enter image description here

Это не дает мне исключения такого элемента, когда я запускаю свой код.

Полное сообщение об ошибке:

java.util.NoSuchElementException at
java.util.Scanner.throwFor(Scanner.java:862) at 
java.util.Scanner.next(Scanner.java:1485) at 
java.util.Scanner.nextInt(Scanner.java:2117) at 
java.util.Scanner.nextInt(Scanner.java:2076) at 
BabyNames.graph(BabyNames.java:75) at 
BabyNames.main(BabyNames.java:13)

1 Ответ

0 голосов
/ 11 декабря 2018

Посмотрите на ваш код:

  1. Как пользователь, чтобы ввести имя
  2. Посмотрите на данный файл и найдите строку, которая начинается с данного имени и возвращает его рейтинг
  3. Показать этот рейтинг в пользовательском интерфейсе

Во втором вы делаете:

  1. Найдите строку с заданным именем
  2. Прочитайте все целые числа отдельно и соберите строкус ним (почему бы просто не прочитать всю строку из файла)
  3. Получить эту строку обратно вызывающей стороне.

В 3-м вы делаете:

  1. Принятьданная строка
  2. Разделить эту строку на отдельные целые числа (опять же, почему бы не принять List<Integer> вместо String[] {1, 2, 3})
  3. Показывать целые числа в пользовательском интерфейсе

Не делатьзабудьте закрыть Scanner после использования, это может привести к возникновению проблемы.


public static void main(String[] args) throws IOException {
    List<Integer> rankings = getRankings(Paths.get("d:/names.txt"));
}

public static List<Integer> getRankings(Path path) throws IOException {
    return getNameRankings(getName(), path);
}

private static String getName() {
    try (Scanner scan = new Scanner(System.in)) {
        System.out.print("Type a name: ");
        return scan.next();
    }
}

private static List<Integer> getNameRankings(String name, Path path) throws IOException {
    String[] data = Files.lines(path)
                         .map(String::trim)
                         .map(line -> line.split("\\s+"))
                         .filter(parts -> parts[0].equalsIgnoreCase(name))
                         .findFirst()
                         .orElse(null);

    if (data == null)
        return Collections.emptyList();

    return IntStream.range(1, data.length)
                    .map(i -> Integer.parseInt(data[i]))
                    .boxed()
                    .collect(Collectors.toList());
}
...