我正在尝试读取文件的每一行,它应该是以下格式:-
name type hours wage salary
然后将该行拆分为各个字段,并进行任何必要的转换(从字符串到int或double)。然后,我将使用静态工厂方法创建<code>salaredemployee/HourlyEmployee。
我想循环员工列表,并在html" target="_blank">控制台上打印出一个表格,列出每个员工的姓名、类型、工时和总工资。每个列都需要对齐,字符串-左对齐,数字-右对齐。所有货币列都应该有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;
}
}
我的子类小时员工:
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();
}
}
我的子类薪水员工:
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;
}
}
尝试改变你的主要:
List<String> employees = new ArrayList<>();
到
List<Employee> employees = new ArrayList<>();
您的数组列表被定义为保存字符串:
List<String> employees = new ArrayList<>();
工厂方法返回一个雇员:
public static Employee factory(String name, String type, int hours, double
wage, double salary)
因此,您不能将员工类型的对象添加到字符串的ArrayList。如果您想解决这个问题,请将ArrayList更改为保存员工类型的对象:
List<Employee> employees = new ArrayList<>();
问题内容: 我的C程序粘贴在下面。在bash中,程序打印“ char is”,不打印Ω。我的语言环境均为en_US.utf8。 问题答案: 这很有趣。显然,编译器将omega从UTF-8转换为UNICODE,但libc某种程度上将其弄乱了。 首先:-format说明符期望一个(即使在wprintf -version 中也是如此),因此您必须指定(并因此指定字符串)。 其次,如果您像这样将语言环境设
问题内容: 我想获得的的通过启动到控制台。如何才能做到这一点? 这是一些不完整的代码: 问题答案: 我最近遇到了这个问题,只想提及自从Java 7以来,流程构建器api已得到扩展。现在可以使用以下方法解决此问题:
问题语句:我有一个在Xcode中运行的程序,它有一堆print()语句,可以很好地将输出打印到调试控制台。然而,我希望也能够将这些输出重定向到一个文件,这样我就可以让用户将它们发送给我,作为调试的一种方式。 SO上找到的解决方案使我可以将输出重定向到文件,但调试控制台输出将丢失。 问:我想要我的蛋糕和吃它。我希望能够将print()语句重定向到调试控制台和文件。 所以我有引用:https://st
你可以使用printf将消息打印到控制台,从而知道应用程序是如何运行的。这是调试代码的很有用的手段,因为你可以打印变量的值、知道什么时候代码将阻塞等等。 我们尝试使用函数unsigned char leds_get(void);打印LED的状态。 获取LED的状态,并将其打印到屏幕。修改test-leds.c如下: #include "contiki.h" #include "dev/leds.h
我真的被困在作业的这一特定部分,它要求我将简单文本打印到控制台中,然后创建一个文件(无论主文件中的std::string文件名是什么),并将控制台的内容打印到该文件中。 我真的很困惑,因为该函数需要ostream,而且它还需要该函数使用任何文件名(在本例中是statistics.txt,只是为了测试该函数是否工作)。 函数是PrintStatistics。 我知道我可以使用cout在控制台上打印,
问题内容: 我从常规命令提示符处运行node.exe没问题: 但是,当我尝试从Cygwin控制台执行相同的操作时,遇到了以下问题: 起初我以为可能是因为Cygwin在路径名称中带有空格(C:\ Program Files \ nodejs)时遇到了麻烦,但是将node.js安装到路径名称中没有空格的目录后,我无法解决问题。 我想使用js-comint从Emacs(从Cygwin运行)运行Node