[英]Trouble printing out ArrayList as Table to the Console
我正在嘗試讀取文件的每一行,其格式應為:
name type hours wage salary
然后將行拆分為各個字段,並進行必要的轉換(從String到int或double)。 然后,我將使用靜態工廠方法創建SalariedEmployee/HourlyEmployee
對象,並將其添加到ArrayList
。
我想循環雇員列表,並在控制台中打印出一張表,其中列出了每個雇員的姓名,類型,工時和總薪水。 每列需要對齊,字符串-左對齊,數字-右對齊。 所有貨幣欄都應有2個頭寸的倉位。 然后,我需要調用totalPay方法來計算員工的總工資。 我還想保留所有雇員的工資總額,並將其顯示在底部的單獨一行中。 確保列與標題對齊。 我想使用System.out.printf格式化和顯示行。
問題是我反復嘗試打印出員工名單,但遇到錯誤
private static final String fileName = "input.txt";
public static void main(String[] args) {
List<Employee> employees = new ArrayList<>(); //
String line = null;
BufferedReader reader = null;
try{
reader = new BufferedReader(new FileReader(new File(fileName)));
while((line = reader.readLine()) != null){
String[] information = line.split("\\s+");
String name = information[0];
String type = information[1];
int hours;
hours = Integer.parseInt(information[2]);
double wage = Double.parseDouble(information[3]);
double salary = Double.parseDouble(information[4]);
employees.add(Employee.factory(name, type, hours, wage, salary));
}
reader.close();
} catch (IOException ex) {
System.out.println("Command-line argument is missing");
System.exit(1);
}
int size = employees.size();
System.out.println("Name Type Hours Total Pay");
for(int i =0; i < size; i++){
System.out.println(employees.getName() + " " +
employees.getType() + " " + employees.getHoursWorked() + " "
Employee.totalPay());
}
}
我的超類員工:
public abstract class Employee{
protected String name;
protected int hours;
public String getName(){
return name;
}
public int getHours(){
return hours;
}
public abstract String getType();
public Employee(String name, int hours){
this.name = name;
this.hours = hours;
}
public abstract double totalPay();
public static Employee factory(String name, String type, int hours, double
wage, double salary){
if(type.equals("Salaried") || type.equals("SALARIED") ||
type.equals("salaried")){
Employee object = new SalariedEmployee(name, hours, (int)salary);
return object;
}else if(type.equals("Hourly") || type.equals("HOURLY") ||
type.equals("hourly")){
Employee object = new HourlyEmployee(name, hours, (int)wage);
return object;
}else{
return null;
}
}
我的子類別HourlyEmployee:
public class HourlyEmployee extends Employee {
private double wage; // wage per hour
private double hoursWorked; // hours worked for week
private int workedHours = (int)hoursWorked;
public HourlyEmployee(String name, double hourlyWage, int workedHours){
super(name, workedHours);
setWage(hourlyWage); // validate hourly wage
setHours(workedHours); // validate hours worked
}
public void setWage(double hourlyWage)
{
if ( hourlyWage >= 0.0 )
wage = hourlyWage;
else
throw new IllegalArgumentException("Hourly wage must be >= 0.0" );
}
public double getWage()
{
return wage;
}
public void setHours(double hoursWorked)
{
if ( ( hoursWorked >= 0.0 ) && ( hoursWorked <= 168.0 ) )
this.hoursWorked = hoursWorked;
else
throw new IllegalArgumentException("Hours worked must be >= 0.0 and
<= 168.0" );
}
public double getHoursWorked()
{
return hoursWorked;
}
@Override
public String getType(){
return "Hourly";
}
@Override
public double totalPay(){
return getWage() * getHours();
}
}
我的子類別SalariedEmployee:
public class SalariedEmployee extends Employee {
private double salary; // wage per year
private double hoursWorked; // hours worked for week
private int workedHours = (int)hoursWorked;
public SalariedEmployee(String name, double salary, int workedHours){
super(name, workedHours);
setSalary(salary); // validate hourly wage
setHours(workedHours); // validate hours worked
}
public void setSalary(double employeeSalary)
{
if ( salary >= 0.0 )
salary = employeeSalary;
else
throw new IllegalArgumentException("Salary must be >= 0.0" );
}
public double getSalary()
{
return salary;
}
public void setHours(double hoursWorked)
{
this.hoursWorked = hoursWorked;
}
public double getHoursWorked()
{
return hoursWorked;
}
@Override
public String getType() {
return "Salaried";
}
@Override
public double totalPay() {
return (getSalary())/52;
}
}
您的ArrayList定義為包含字符串:
List<String> employees = new ArrayList<>();
您的工廠方法將返回一個Employee:
public static Employee factory(String name, String type, int hours, double
wage, double salary)
因此,您不能將Employee類型的對象添加到String的ArrayList中。 如果要解決此問題,請更改ArrayList以容納Employee類型的對象:
List<Employee> employees = new ArrayList<>();
嘗試更改主目錄:
List<String> employees = new ArrayList<>();
至
List<Employee> employees = new ArrayList<>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.