[英]Read txt file into array then find min max and average of salaries
看起来这是这类问题的一周。 在阅读了所有新旧知识之后,我同样感到困惑!
我有一个包含5名员工的文本文件,每名员工的姓名下都列出了10个薪水值。 我要阅读此文件,查找并显示每个人的雇员姓名,最低工资,最高工资和平均工资。 我必须有3个循环:一个循环控制读取文件,一个循环将数据放入数组,另一个循环进行计算。 我必须在一行上打印每个人的信息,并且我必须允许使用我从未听说过的Math.round
将小数四舍五入到小数点后两位。
我很尴尬地向您展示我所拥有的一堆代码,因为它不多,但是在阅读完所有内容后,我什至不知道我是否能正确启动。 我什至不知道我是否正确地知道如何进行。 感谢您的帮助。
更新代码:再次!
import javax.swing.*;
import java.io.*;
public class MinMaxSalary3
{
public static void main(String args[])throws Exception
{
// Declare input file to be opened.
FileReader fr = new FileReader ("salary.dat");
BufferedReader br = new BufferedReader (fr);
//General Declarations
final String TITLE = "Employee's Salary Report";
String employeeName, salaryString;
double avgSalary=0.0;
double totalSalary = 0.0;
double sum = 0.0;
// Declare Named Constant for Array.
final int MAX_SAL = 10;
// Declare array here.
int salary[] = new int[MAX_SAL];
System.out.println (TITLE);
while ((employeeName = br.readLine()) != null)
{
System.out.print ("" + employeeName);
// Use this integer variable as your loop index.
int loopIndex;
// Assign the first element in the array to be the minimum and the maximum.
double minSalary = salary[1];
double maxSalary = salary[1];
// Start out your total with the value of the first element in the array.
sum = salary[1];
// Write a loop here to access array values starting with number[1]
for (loopIndex = 1; loopIndex < MAX_SAL ;loopIndex++)
// Within the loop test for minimum and maximum salaries.
{
if (salary[loopIndex] < minSalary)
{
minSalary = salary[loopIndex];
if (salary[loopIndex] > maxSalary)
maxSalary = salary[loopIndex];
}
{
// Also accumulate a total of all salaries.
sum += sum;
// Calculate the average of the 10 salaries.
avgSalary = sum/MAX_SAL;
}
// I know I need to close the files, and end the while loop and any other loops. I just can't think that far right now.
}
{
// Print the maximum salary, minimum salary, and average salary.
System.out.println ("Max Salary" + maxSalary);
System.out.println ("Min Salary" + minSalary);
System.out.println ("Avg Salary" + avgSalary);
}
System.exit(0);
}
}
}
我必须有3个循环:一个循环控制读取文件,一个循环将数据放入数组,另一个循环进行计算。
我现在在下面写的内容可能对您来说更像个傻瓜,但是如果您过去了这堂课,可能会很有用。
另一种看待这种情况的方式将是更面向对象,并更好地引导:您需要一个对象来保存数据,执行计算并呈现输出。 您如何获取数据并不重要。 今天是档案; 下次可能是HTTP请求。
从Employee对象开始。 我故意遗漏了很多细节,您需要填写并弄清楚:
package model;
public class Employee {
private String name;
private double [] salaries;
public Employee(String name, int numSalaries) {
this.name = name;
this.salaries = new double[numSalaries];
}
public double getMinSalary() {
double minSalary = Double.MAX_VALUE;
// you fill this in.
return minSalary;
};
public double getMaxSalary() {
double maxSalary = Double.MIN_VALUE;
// you fill this in.
return maxSalary;
}
public double getAveSalary() {
public aveSalary = 0.0;
if (this.salaries.length > 0) {
// you fill this in.
}
return aveSalary;
}
}
这种方法的优点是您可以单独测试它,而不必担心文件I / O的所有废话。 正确放置此对象,放在一边,然后再处理下一个对象。 最终,将所有这些较小的零件组装在一起时,您将获得一个干净的解决方案。
使用JUnit在没有文件I / O的情况下对其进行测试:
package model;
public class EmployeeTest {
@Test
public void testGetters() {
double [] salaries = { 10000.0, 20000.0, 30000.0, 40000.0 };
Employee testEmployee = new Employee("John Q. Test", salaries);
Assert.assertEquals("John Q. Test", testEmployee.getName());
Assert.assertEquals(10000.0, testEmployee.getMinSalary(), 1.0e-3);
Assert.assertEquals(40000.0, testEmployee.getMaxSalary(), 1.0e-3);
Assert.assertEquals(25000.0, testEmployee.getMinSalary(), 1.0e-3);
}
}
在这种情况下,您希望采用的方法是一种面向对象的方法。 请记住,对象是相关数据的表示。 考虑一个Employee
可能有关于他们的薪水,名字和他们在哪个部门工作的信息(例如)。
但这只是一名 Employee
。 您可能有数百个 。
考虑创建一个雇员模型。 定义与其中之一最相关的内容。 例如,他们都必须有一个名字,并且必须有薪水。
然后,人们将选择处理查找有关雇员集合的信息(包括最低,最高和平均薪水) 超出通用Employee对象范围的逻辑。
这个想法是这样的:
Employee
了解自己的一切。 对于您的问题正在寻找的问题,我可能不太了解-我什至不确定您是否可以使用确实很烂的对象-但这绝对是一个开始。
至于您的编译错误:
salary
是double[]
。 数组内部包含许多不同类型的double
类型的值,但是double[]
不直接是double
。 从技术立场和语义立场来看,将非数组类型分配给数组类型都行不通-您正在使用可以容纳许多值的东西,然后尝试将其分配给可以容纳一个值的容器。
从您的代码示例,您要使用一个循环(一个循环变量i
)遍历中的所有元素salary
,并为它们分配一定的价值。 仅使用salary[0]
仅修改第一个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.