Мне кажется, что упражнение состоит в том, чтобы создать коллекцию из 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();
}
}
}