繁体   English   中英

将txt文件读入数组,然后找到最低和最高平均工资

[英]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了解自己的一切。
  • 开发人员有责任将多个员工捆绑在一起。

对于您的问题正在寻找的问题,我可能不太了解-我什至不确定您是否可以使用确实很烂的对象-但这绝对是一个开始。


至于您的编译错误:

  • salarydouble[] 数组内部包含许多不同类型的double类型的值,但是double[]不直接是double 从技术立场和语义立场来看,将非数组类型分配给数组类型都行不通-您正在使用可以容纳许多值的东西,然后尝试将其分配给可以容纳一个值的容器。

    从您的代码示例,您要使用一个循环(一个循环变量i )遍历中的所有元素salary ,并为它们分配一定的价值。 仅使用salary[0]仅修改第一个元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM