首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >薪金演习

薪金演习
EN

Code Review用户
提问于 2019-10-26 21:48:49
回答 1查看 1.9K关注 0票数 2

Hey,伙计们,我刚刚完成了一个uni的练习,我真的很想得到一些反馈,因为我对java的使用还很陌生。在这个例子中,我特别可以使用一些输入:代码的可读性、变量的名称、javaDoc注释、错误语句的正确使用,以及最重要的是not3TimesHigher方法,这些都花了我很长时间才完成,我仍然不确定这是否是最好的方法。

在任何人写任何东西之前,<#>A警告:请不要建议对我的代码进行任何过于复杂的更新,我是初学者,我被要求在这些限制范围内工作。

<#>Anyway这里是供参考的问题单:

一家公司将其员工的工资存储在一个ArrayList allSalaries中,这是一个由类型为double的数组组成的ArrayList。allSalaries中的每个条目都是一年中12个月雇员的12个月工资的数组。

使用构造函数·public ArrayList ()编写一个类工资,没有参数来创建初始空的。并编写以下方法:

·公共无效添加(double[] employeeSalaries)将一名员工的薪资添加到字段变量allSalaries中。

·公共静态双平均法(double[] employeeSalaries)计算员工的平均工资。请注意,任何0项都应置之不理,因为0表示该雇员在该月份没有受雇。例如,{1000、1000、2000、2000、0、0、0、0、0、0、0}的平均值应该为1500.0,作为四个非零值除以4的总和。如果annualSalaries数组中的所有值为零,则该方法应该抛出一个IllegalArgumentException。

·public ArrayList averageSalaries()方法生成一个ArrayList,存储至少有一个非零月薪的所有员工的平均薪资。利用方法的平均值。提示:您需要捕获方法平均值引发的可能异常。

·公共布尔not3TimesHigher()方法检查每个月工资至少为一个非零的雇员,他们的平均工资是否不高于其他雇员平均工资总额的三倍。也就是说,这里需要平均数的平均值。

代码语言:javascript
复制
import java.util.ArrayList;

public class Salaries {
private ArrayList allSalaries;

public Salaries() {
    allSalaries = new ArrayList();
}

public void add(double[] employeeSalaries) {
    allSalaries.add(employeeSalaries);
}

/** 
 * @param takes an array of doubles; each index of the array represents
 * the earnings of an employee for that particular month.
 *
 * @return average salary of an employee. 
 */
public static double average(double[] employeeSalaries) {
    double totalSalary = 0;
    int totalMonths = 0;

    for (int i=0; i 0) {
            totalSalary += employeeSalaries[i];
            totalMonths++;
        } 
        if (totalSalary == 0) {
            throw new IllegalArgumentException("This chump didn't earn any money!");
        }
    } 
    return totalSalary / totalMonths;
}

/** 
 * Method traverses allSalaries calculating the average salary for each employee
 * and appending it to a newly a instantiated ArrayList. 
 * 
 * @return ArrayList containing average salaries for all employees with at least one
 * monthly salary above 0.
 */
public ArrayList averageSalaries() {
    ArrayList averageSalaries = new ArrayList();

    try {
    for (int i=0; i avgS = averageSalaries();

    for (int i=0; i (average(allOtherEmployees) * 3)) {
            return false;
        }
    } return true;
}

public static void main(String[] args) {
    //double[] bowie = {2456, 1330, 0, 5470};

    double[] paul = {5, 8, 4, 6};
    double[] ringo = {5, 7, 4, 6};
    double[] john = {0, 0, 0, 0};
    double[] george = {3, 7, 9, 8};

    Salaries a = new Salaries();
    //a.add(bowie);
    a.add(paul);
    //a.add(john);
    a.add(ringo);
    a.add(george);

    //System.out.println(Salaries.average(john));

    System.out.println(a.averageSalaries());

    System.out.println(a.not3TimesHigher());
  }
}
EN

回答 1

Code Review用户

发布于 2019-10-26 22:53:11

谢谢你分享你的代码。

我认为你在这次练习中做得很好。因此,我只想提几点:

正确性

我认为您的方法averageSalaries()是不正确的,因为它是在捕获第一个异常并且没有处理其他输入行之后返回的。据我了解,“未付款”条目应该被忽略,所有其他条目都应该被处理。这意味着,代码应该如下:

代码语言:javascript
复制
public ArrayList averageSalaries() {
    ArrayList averageSalaries = new ArrayList();

    for (int i=0; i

可读性

码格式

使用集成开发环境(比如eclipse、intelliJ NetBeans或类似的开发环境)并使用它的自动格式化功能。

命名

使您的名字尽可能地具体化.

在您的方法average()中,有一个变量totalMonths。用这个名字,我可以得到处理的月总数,但是它包含了非零支付的蛾数。在我看来,monthsWithPayment是一个更好的名字。

避免使用单个字母名称.

在main()方法中,引用Salaries对象的变量名为a。寻找好的名字是编程中最难的部分。所以你不应该放弃一个练习好名字的机会,即使它只是你的练习解决方案的一种测试方法。

循环

在许多地方,如果不是所有的地方,for循环的“每一个”形式都会提高可读性:

代码语言:javascript
复制
for (double[] emploeeMonthlyPayments : allSalaries) {
    try {
        double avgEmployeeSalary = average(emploeeMonthlyPayments);
        averageSalaries.add(avgEmployeeSalary);
         // ...

Off Topic

我认为这个练习不太好:

命名

本练习要求您编写一个名为not3TimesHigher的方法,返回一个boolean值。在我看来,这个名字在你看来是不好的:

因此,这个方法的名称最好是isLessThanAverageTimes3()。

引用相同的(JavaCode约定),方法的[https://www.oracle.com/technetwork/java/codeconventions-135099.html]名称应该以动词开头。但是这个练习中所要求的方法名(average(),averageSalaries())是名词。他们最好是calculateAverage(),calculateAverageSalaries()。

使用static关键字

使用static关键字有更多的缺点,而不是优势。它应该谨慎使用,并有一个很好的理由。我看不到在方法static中使用average()关键字的“很好的理由”。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/231353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档