java - 无法将 ArrayList 作为表打印到控制台

标签 java inheritance arraylist error-handling printf

我正在尝试读取文件的每一行,该文件应采用以下格式:-

 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());
    }
}

我的父类(super class)员工:

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 类型的对象添加到字符串的 ArrayList 中。如果您想解决此问题,请将 ArrayList 更改为保存 Employee 类型的对象:

List<Employee> employees = new ArrayList<>();

关于java - 无法将 ArrayList 作为表打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45468441/

相关文章:

java - For循环应该打印出ArrayList属性和其他ArrayList属性

java - 我的 Admob 广告没有绘图,但是有吗? (LibGDX Admob 6.4.1)

java - 检测 Java 中的任何组合字符

java - 如何对这个类进行类型转换?

unit-testing - MOQ - 如何模拟需要转换为另一个接口(interface)的接口(interface)?

inheritance - 模仿多重继承

Java 查找文件名和扩展名的开头

java - 从 setOnAction 启动电子邮件客户端

java - 将数据从 ArrayList 加载到 DefaultTableModel

android - 如何在具有通过 ArrayAdapter 放置的 ArrayList 的 ListView 上设置字体