Как пропустить строку в файле для чтения, чтобы получить число с плавающей запятой, которое следует после? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь прочитать в данном файле, файл состоит из различных атрибутов, которые я должен дать «работникам» класса, эти атрибуты задаются именем атрибута, а затем числом с плавающей точкой, связанным срабочий, т. е. Изготовление .25 Обслуживание .45 Диагностика .65

Я пытаюсь использовать сканер, чтобы получить только число с плавающей точкой, но получаю ошибку исключения при попытке использовать s.nextFloat ();Я не уверен, как разделить всю строку, чтобы я мог вернуть только значение с плавающей точкой.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Worker
{
        public static void main(String args[]) throws FileNotFoundException 
        {
            //creating File instance to reference text file in Java
           // File text = new File("Workers.txt");
            //Creating Scanner instance to read File in Java
            //File text = new File("Workers.txt");



            Scanner s = new Scanner(new File("Workers.txt"));
            TheWorker one = new TheWorker(s);

            System.out.println(one.Fab);

            s.close();  
        }   
}

class TheWorker
{
    String workername;
    String type;
    String CanWork = "Any";
    float hourlyRate;
    float Fab;
    float Serv;
    float Diag;
    float Trans;
    float Intake;
    float BW;
    float Paint;
    boolean working;

    public TheWorker(Scanner s) 
    {
        workername = s.nextLine();
        String type = s.next();
        if(type != "Full-Time")
        {
            String temp = s.next();
            if (temp.charAt(0) == '(')
            {
                CanWork = temp.substring(1,temp.length()-1);
                temp = s.next();
            }
            hourlyRate = Float.parseFloat(temp);
        }
        Fab = s.nextFloat();
        Serv = s.nextFloat();
        Diag = s.nextFloat();
        Trans = s.nextFloat();
        Intake = s.nextFloat();
        BW = s.nextFloat();
        Paint = s.nextFloat();  

    }


    TheWorker(String workername, String type, String CanWork, float hourlyRate, float Fab, float Serv, float Diag, float Trans, float Intake, float BW, float Paint, boolean working)
    {
        this.workername = workername;
        this.type = type;
        this.CanWork = CanWork;
        this.hourlyRate = hourlyRate;
        this.Fab = Fab;
        this.Serv = Serv;
        this.Diag = Diag;
        this.Trans = Trans;
        this.Intake = Intake;
        this.BW = BW;
        this.Paint = Paint;
        this.working = working;
    }
}

====Snippet from Workers.txt===
Eikichi Onizuka
Part-Time (Afternoon) 8.00 phr
Fabrication         .35
Service/Mechanics   .25 
Diagnostics         .25
Brake/Transmission  .25
Intake/Exhaust      .15
Body Work           .25
Paint/Finish        .45

Yusuke Urameshi
Part-Time (Afternoon) 7.60 phr
Fabrication         .35
Service/Mechanics   .55 
Diagnostics         .05
Brake/Transmission  .35
Intake/Exhaust      .45
Body Work           .15
Paint/Finish        .15




Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseFloat(Unknown Source)
    at java.lang.Float.parseFloat(Unknown Source)
    at TheWorker.<init>(Worker.java:60)`enter code here`
    at Worker.main(Worker.java:18)

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Мне кажется, что упражнение состоит в том, чтобы создать коллекцию из Worker объектов из текстового файла.

Сначала давайте посмотрим, как читать текстовый файл с использованием класса Scanner. Класс Scanner имеет конструктор, который принимает Path . Но Path - это интерфейс, поэтому вам нужно использовать класс Paths для создания соответствующего Path.

Path p = Paths.get("Workers.txt");
Scanner s = new Scanner(p);

Теперь вы можете использовать Scanner для чтения файла. строка за строкой.

while (s.hasNextLine()) {
    String line = s.nextLine();
}

Это практически весь код, необходимый для чтения файла.
Теперь вы хотите использовать данные из файла для создания Worker объектов.
Я будуПредположим, что файл имеет тот же формат, что и отправленный вами образец, т.е. каждая «рабочая» информация занимает ровно девять строк, где первая строка - это имя рабочего, а пустая строка разделяет каждого «рабочий». Каждая строка требует своей особой обработки, поэтому я буду управлять переменной counter, чтобы сообщить мне, какие рабочие детали я только что прочитал. И когда я читаю пустую строку, я знаю, что у меня есть все детали для одного «рабочего».

Кроме того, я буду хранить все Worker объекты, которые я создаю, в коллекции, List если быть точным.

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Worker {
    private String workername;
    private String type;
    private String canWork = "Any";
    private float hourlyRate;
    private float fab;
    private float serv;
    private float diag;
    private float trans;
    private float intake;
    private float bw;
    private float paint;
    private boolean working;

    // Constructor
    public Worker(String workername,
                  String type,
                  String canWork,
                  float hourlyRate,
                  float fab,
                  float serv,
                  float diag,
                  float trans,
                  float intake,
                  float bw,
                  float paint,
                  boolean working) {
        this.workername = workername;
        this.type = type;
        this.canWork = canWork;
        this.hourlyRate = hourlyRate;
        this.fab = fab;
        this.serv = serv;
        this.diag = diag;
        this.trans = trans;
        this.intake = intake;
        this.bw = bw;
        this.paint = paint;
        this.working = working;
    }

    // Overrides method in class java.lang.Object
    public String toString() {
        return String.format("%s %s (%s) %.2f phr: Fabrication: %.2f, Service: %.2f, Diagnostics = %.2f, Transmission = %.2f, Intake = %.2f, Body Work = %.2f, Paint = %.2f",
                             workername,
                             type,
                             canWork,
                             hourlyRate,
                             fab,
                             serv,
                             diag,
                             trans,
                             intake,
                             bw,
                             paint);
    }

    public static void main(String[] args) {
        Path p = Paths.get("Workers.txt");

        // try-with-resources to automatically close the Scanner
        try (Scanner s = new Scanner(p)) {
            List<Worker> workers = new ArrayList<>();
            int counter = 0;
            String workerName = null;
            String type = null;
            String canWork = null;
            float hourlyRate = 0.0f;
            float fab = 0.0f;
            float serv = 0.0f;
            float diag = 0.0f;
            float trans = 0.0f;
            float intake = 0.0f;
            float bw = 0.0f;
            float paint = 0.0f;
            String[] parts;
            while (s.hasNextLine()) {
                String line = s.nextLine();
                if (line.length() == 0) {
                    Worker aWorker = new Worker(workerName,
                                                type,
                                                canWork,
                                                hourlyRate,
                                                fab,
                                                serv,
                                                diag,
                                                trans,
                                                intake,
                                                bw,
                                                paint,
                                                true);
                    System.out.printf("%n%s%n", aWorker);
                    workers.add(aWorker);
                    workerName = null;
                    type = null;
                    canWork = null;
                    hourlyRate = 0.0f;
                    fab = 0.0f;
                    serv = 0.0f;
                    diag = 0.0f;
                    trans = 0.0f;
                    intake = 0.0f;
                    bw = 0.0f;
                    paint = 0.0f;
                    counter = 0;
                }
                else {
                    counter++;
                    switch (counter) {
                        case 1:
                            workerName = line;
                            break;
                        case 2:
                            parts = line.split(" ");
                            if (parts.length > 0) {
                                type = parts[0];
                            }
                            if (parts.length > 1) {
                                canWork = parts[1].substring(1, parts[1].length() - 1);
                            }
                            if (parts.length > 2) {
                                hourlyRate = Float.parseFloat(parts[2]);
                            }
                            break;
                        case 3:
                            parts = line.split("\\s+");
                            fab = Float.parseFloat(parts[1]);
                            break;
                        case 4:
                            parts = line.split("\\s+");
                            serv = Float.parseFloat(parts[1]);
                            break;
                        case 5:
                            parts = line.split("\\s+");
                            diag = Float.parseFloat(parts[1]);
                            break;
                        case 6:
                            parts = line.split("\\s+");
                            trans = Float.parseFloat(parts[1]);
                            break;
                        case 7:
                            parts = line.split("\\s+");
                            intake = Float.parseFloat(parts[1]);
                            break;
                        case 8:
                            parts = line.split("\\s+");
                            bw = Float.parseFloat(parts[2]);
                            break;
                        case 9:
                            parts = line.split("\\s+");
                            paint = Float.parseFloat(parts[1]);
                            break;
                        default:
                            System.out.println("Unexpected: " + counter);
                    }
                }
                System.out.println(line);
            }

            // Make sure we add the last "worker" in the file to our list.
            if (counter > 0) {
                Worker aWorker = new Worker(workerName,
                                            type,
                                            canWork,
                                            hourlyRate,
                                            fab,
                                            serv,
                                            diag,
                                            trans,
                                            intake,
                                            bw,
                                            paint,
                                            true);
                System.out.printf("%n%s%n", aWorker);
                workers.add(aWorker);
            }
        }
        catch (IOException xIo) {
            xIo.printStackTrace();
        }
    }
}
0 голосов
/ 03 октября 2019

Исходя из вашего входного файла, вы должны делать

  1. Чтение строки для имени
  2. Чтение строки и разбиение для Part-Time (Afternoon) 8.00 phr - только arr [1] - это число с плавающей запятой
  3. Считать строку X 7 раз, разделив каждый раз на Fabrication .35, снова только arr [1] - это число с плавающей запятой

См. Строка:: раскол

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...