3

首先,这里是说明: http:
//ideone.com/eRHwUo
是的,这是作业!话虽如此(因为我只是喜欢这种语言),当您发布答案时,请尝试使用伪代码,这样我就不会复制并粘贴到我的程序中。谢谢!

就代码而言,我已经完成了用户输入所有输入部分所需的一切。但是,我需要帮助将数据从类“传输”到我们应该使用的“ArrayList”。我想一旦我把它记下来,我就可以对数组进行排序以找到选择“B”的 ID 号,如果用户输入“C”,我将循环显示数组中的所有内容它。

无论如何,进入代码(这是主要的):

/*
 * Name:
 * Date:
 * Assignment 2
 */

import java.util.Scanner;

public class homework 
{
    public static void main(String[] args)
    {
        char userSelection;
        String convertString;
        String userStrings;
        Scanner kbd = new Scanner(System.in);

        do 
        {
            System.out.println("Here are your choices:");
            System.out.println("A. Enter employee data" +
                             "\nB. Search for employee data" +
                             "\nC. List all data" +
                             "\nD. Exit");

            convertString = kbd.next();
            userSelection = convertString.charAt(0);

            switch(userSelection)
            {
            case 'A':
                GetUserInfo();
                break;
            case 'B':
                // Stuff;
                break;
            case 'C':
                // Display all data;
                break;
            case 'D':
                System.out.println("Goodbye!");
                break;
            default:
                System.out.println("Error, that is not a valid entry. Please try again.");
            }
        } while (userSelection > 'D');
    }

    // Write functions here
    public static void GetUserInfo()
    {
        String firstName;
        String lastName;
        String empID;
        double hourlyRate;
        int hoursWorked;
        double withPercent;

        Scanner kbd = new Scanner(System.in);

        System.out.println("What is your first name?");
        firstName = kbd.next();

        System.out.println("What is your last name?");
        lastName = kbd.next();

        System.out.println("What is your employee ID?");
        empID = kbd.next();

        Employee user = new Employee(empID);

        user.setFirstName(firstName);
        user.setLastName(lastName);

        System.out.println("What is your hourly rate?");
        hourlyRate = kbd.nextDouble();

        System.out.println("How many hours did you work?");
        hoursWorked = kbd.nextInt();

        System.out.println("What is your withholding percentage?");
        withPercent = kbd.nextDouble();

        Pay user1 = new Pay();

        user1.setHourlyRate(hourlyRate);
        user1.setHoursWorked(hoursWorked);
        user1.setWithPercent(withPercent);
    }
}

这是员工类:

public class Employee 
{
    // Members of the class
    String firstName;
    String lastName;
    String employeeID;
    // remember about the pay object

    // EmployeeID constructor
    public Employee(String empID)
    {
        this.employeeID = empID;
    }

    // Below are the various getters and setters of the Employee class
    public String getFirstName() 
    {
        return firstName;
    }

    public void setFirstName(String firstName) 
    {
        this.firstName = firstName;
    }

    public String getLastName() 
    {
        return lastName;
    }

    public void setLastName(String lastName) 
    {
        this.lastName = lastName;
    }

    public String getEmployeeID() 
    {
        return employeeID;
    }

}

这是 Pay 类:

public class Pay 
{
    // Members of the class
    double hourlyRate;
    int hoursWorked;
    double withPercent;

    // Various getters and setters of the Pay class
    public double getHourlyRate() 
    {
        return hourlyRate;
    }

    public void setHourlyRate(double hourlyRate)
    {
        this.hourlyRate = hourlyRate;
    }

    public int getHoursWorked() 
    {
        return hoursWorked;
    }

    public void setHoursWorked(int hoursWorked) 
    {
        this.hoursWorked = hoursWorked;
    }

    public double getWithPercent() 
    {
        return withPercent;
    }

    public void setWithPercent(double withPercent)
    {
        this.withPercent = withPercent;
    }   

    // Calculates the raw payment
    public double CalcPayRate(double hourlyRate, int hoursWorked)
    {
        return hourlyRate * hoursWorked;
    }

    // If the employee has worked overtime, calculates the new payment
    public double CalcOvertimePay(double hourlyRate, int hoursWorked)
    {
        double rawPay = 0;

        rawPay = hourlyRate * hoursWorked;

        if (hoursWorked > 40)
        {
            rawPay *= 1.5;
        }

        return rawPay;
    }

    // Calculates final amount that the employee will be paid
    public double CalcTotalPay(double hourlyRate, int hoursWorked, double withPercent)
    {
        double rawPay = 0;
        double subTotalPay = 0;
        double finalPay = 0;

        rawPay = hourlyRate * hoursWorked;
        subTotalPay = rawPay * withPercent;
        finalPay = rawPay - subTotalPay;

        return finalPay;
    }
}

那么,请思考?
另外,最后的评论:
(1)我不明白“支付对象”在 Employee 类下应该做什么?
(2) 如何使用输入数据创建“支付对象”,然后创建员工对象?
这些是我不太清楚的说明中的两个部分,因此,如果您可以对此有所了解,那将会很有帮助!
(3) 如果我的语法有什么不对的地方,请告诉我,以便我可以相应地更改它。我还是这种语言的新手,所以任何帮助都会很棒。

编辑:我用评论更新了我的代码:

public class homework 
{
    public static void main(String[] args)
    {
        // ArrayList<Employee> employeeList = new ArrayList<Employee>();

        do 
        {
            // Stuff commented out for readability

            case 'A':
                PromptForInput();
                // Employee emp = PromptForInput();
                // employeeList.add(emp);
                break;
            } while (userSelection > 'D');
    }

    // public static Employee PromptInput()
    public static void PromptForInput()
    {           
        Employee user = new Employee(empID);

        // Isn't this supposed to be returned as well?          
        Pay user1 = new Pay();

        user1.setHourlyRate(hourlyRate);
        user1.setHoursWorked(hoursWorked);
        user1.setWithPercent(withPercent);

        //return user;
    }
}

这是它应该看起来的样子吗?
我仍然不明白作业的“支付对象”部分..

4

3 回答 3

4

首先看一下Collections

如果我这样做...

我会EmployeegetUserInfo方法返回并将其添加到ArrayList调用方法中。这使该getUserInfo方法专注于单一职责。

如果用户输入的值没有通过验证,我也会允许getUserInfo返回,但这可能超出了要求的范围。null

例如...

List<Employee> employees = // create ArrayList...
//...

Employee emp = getUserInfo();
if (emp != null) {
    employees.add(emp);
}

您还应该在创建Pay对象Employee时将对象设置为 ,这会将Pay对象关联到 ,Employee以便您以后可以找到它

至于你的Pay对象。和不需要参数,因为这些方法所需的所有信息都应该可以从对象的属性中CalcPayRate获得CalcOvertimePay......CalcTotalPay

例如...

public double getRawPay() {
    return getHoursWorked() & getHourlyRate();
}

我还鼓励您查看Java 编程语言的代码约定

更新#1

Pay对象Employee

基本上,您需要提供一个实例字段/属性来保存引用以及一些设置和获取引用的方法,例如......

public class Employee 
{
    //...
    Pay pay;

    // EmployeeID constructor
    public Employee(String empID)
    {
        this.employeeID = empID;
    }

    // EmployeeID constructor
    public Employee(String empID, Pay pay)
    {
        this(empID);
        this.pay = pay;
    }

    public void setPay(Pay pay) {
        this.pay = pay;
    }

    public Pay getPay() {
        return pay
    }
    //...
}

我提供了第二个构造函数,你并不真的需要它,但它展示了它是如何实现的。

然后,您只需将引用传递PayEmployee...

Employee emp = new Employee(...);
//...
Pay pay = new Pay();
//...
emp.setPay(pay);

更新#2

另一种方法是在创建 Employee 时创建 Pay 的实例......

public class Employee 
{
    //...
    Pay pay = new Pay();

    // EmployeeID constructor
    public Employee(String empID)
    {
        this.employeeID = empID;
    }

这表明我们不再需要setPay,但这取决于您。

当您需要获取或设置 Pay 的值时,您只需向 Employee 的实例询问它

Employee emp = ...;
emp.getPay().setHourlyRate(hourlyRate);
//...
double hourlyRate = emp.getPay().getHourlyRate();

更新#3

基本上,您需要将 的实例Pay与 的实例相关联Employee。如果它更容易,请将其命名为其他名称...

基于更新 #1 中的示例

public static Employee PromptForInput()
{
    String firstName;
    String lastName;
    String empID;
    double hourlyRate;
    int hoursWorked;
    double withPercent;

    //...
    Employee user = new Employee(empID);

    user.setFirstName(firstName);
    user.setLastName(lastName);

    //...

    Pay payObj = new Pay();

    payObj .setHourlyRate(hourlyRate);
    payObj .setHoursWorked(hoursWorked);
    payObj .setWithPercent(withPercent);

    // Don't forget to give an instance of Pay to the instance
    // of Employee
    user.setPay(payObj);

    return user;
}

可以将Employee其视为一个容器,其中包含员工的姓名和 ID 以及他们的工资详细信息。当您从 的新实例开始时Employee,它只是一个空容器,您需要填充它...

当您需要时,您只需PayEmployeevia请求和实例getPay

更新#4

根据你的新代码,我只会提出一个小建议......

在显示所有数据选项中,您可以使用以下循环来显示员工和员工的工资率,例如...

for (int i = 0; i < employeeList.size(); i++)
{
    Employee emp = employeeList.get(i);
    System.out.println(emp);
    System.out.println(emp.getPay().CalcPayRate());
}
于 2013-09-29T03:42:35.597 回答
2

查看说明,我认为您应该创建一个具有通用类型 Employee 的 ArrayList。GetUserInfo() 应该返回它刚刚创建的 Employee 对象,并且这个 Employee 对象应该存储到 ArrayList 中——在函数调用之后——使用它的 .add() 函数。

编辑:

我在你的底部三个问题上的尝试。

1) 工资对象应该被雇员对象中的一个变量引用。您可以使用在 Employee 对象中创建另一个 setter 方法来执行此操作。

2)我相信您已经通过以下代码做到了这一点:

user1.setHourlyRate(hourlyRate);
user1.setHoursWorked(hoursWorked);
user1.setWithPercent(withPercent);

3) 语法对我来说很好。

于 2013-09-29T03:33:50.510 回答
1

A. 输入员工数据

您正在利用一个类(名词)来执行操作。动作通常转化为方法调用。甚至您对“get”的使用(按照惯例,类不应以 get 开头)建议引入一种方法。因此,将 GetUserInfo 更改为

private static Employee promptForEmployeeInfo()

//or more simply
private static Employee getEmployee()

然后,您可以在收集完所有必要信息(包括工资信息)后返回一个员工对象。然后您需要向员工对象提供工资信息。在最基本的形式中,这将通过实例化 Pay 对象并将其传递给 Employee 的构造函数(对于不可变对象,这是比您需要的更高级的技术)或通过 setter 方法来完成。

在您的 main 方法中,List 将在您的 do/while 循环之前被实例化。每次用户输入“A”时,您都会调用employeeList.add('insert Employee method call here')。

(1) 我不明白 Employee 类下的“Pay Object”应该做什么

在面向对象编程 (OOP) 中,将数据和对该数据的操作封装到一个描述性的、适当命名的类中是 OOP 约定的一部分。

于 2013-09-29T03:51:24.687 回答