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()方法检查每个月工资至少为一个非零的雇员,他们的平均工资是否不高于其他雇员平均工资总额的三倍。也就是说,这里需要平均数的平均值。
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());
}
}发布于 2019-10-26 22:53:11
谢谢你分享你的代码。
我认为你在这次练习中做得很好。因此,我只想提几点:
我认为您的方法averageSalaries()是不正确的,因为它是在捕获第一个异常并且没有处理其他输入行之后返回的。据我了解,“未付款”条目应该被忽略,所有其他条目都应该被处理。这意味着,代码应该如下:
public ArrayList averageSalaries() {
ArrayList averageSalaries = new ArrayList();
for (int i=0; i可读性码格式使用集成开发环境(比如eclipse、intelliJ NetBeans或类似的开发环境)并使用它的自动格式化功能。
命名使您的名字尽可能地具体化.在您的方法average()中,有一个变量totalMonths。用这个名字,我可以得到处理的月总数,但是它包含了非零支付的蛾数。在我看来,monthsWithPayment是一个更好的名字。
避免使用单个字母名称.在main()方法中,引用Salaries对象的变量名为a。寻找好的名字是编程中最难的部分。所以你不应该放弃一个练习好名字的机会,即使它只是你的练习解决方案的一种测试方法。
循环
在许多地方,如果不是所有的地方,for循环的“每一个”形式都会提高可读性:
for (double[] emploeeMonthlyPayments : allSalaries) {
try {
double avgEmployeeSalary = average(emploeeMonthlyPayments);
averageSalaries.add(avgEmployeeSalary);
// ...Off Topic我认为这个练习不太好:
命名本练习要求您编写一个名为not3TimesHigher的方法,返回一个boolean值。在我看来,这个名字在你看来是不好的:
根据(JavaCode约定),类型为[https://www.oracle.com/technetwork/java/codeconventions-135099.html]的变量名称和返回boolean的方法应该以is、has、can或相似开头。boolean类型的变量名称和返回boolean的方法应该表示正条件。当在名称中使用数字时,它们应该是名称中的最后一部分。因此,这个方法的名称最好是isLessThanAverageTimes3()。
引用相同的(JavaCode约定),方法的[https://www.oracle.com/technetwork/java/codeconventions-135099.html]名称应该以动词开头。但是这个练习中所要求的方法名(average(),averageSalaries())是名词。他们最好是calculateAverage(),calculateAverageSalaries()。
使用static关键字使用static关键字有更多的缺点,而不是优势。它应该谨慎使用,并有一个很好的理由。我看不到在方法static中使用average()关键字的“很好的理由”。
https://codereview.stackexchange.com/questions/231353
复制相似问题