将文本文件读入数组然后找到最小最大值和工资平均值

时间:2012-10-21 16:18:49

标签: java arrays

看起来这是这类问题的一周。在阅读了所有新的和旧的之后,我也同样感到困惑!

我有一个包含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);
    }
  }
}

2 个答案:

答案 0 :(得分:2)

  

我必须有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);     
    }
}

答案 1 :(得分:1)

在这种情况下,您希望采用的方法是面向对象的方法。请记住,对象是相关数据的表示。考虑Employee可能有关于他们的薪水,姓名以及他们所在的部门的信息(作为示例)。

但那只是一个 Employee。你可能有数百

考虑创建一个Employee模型。定义与其中一个最相关的内容。例如,他们都必须有一个名字,并且必须有薪水。

然后,人们会选择处理查找有关员工集合的信息的逻辑 - 包括最低,最高和平均工资 - 在通用Employee对象范围之外

这个想法是这样的:

  • Employee了解自己的一切。
  • 开发人员有责任将多名员工绑在一起。

我可能不太了解你的问题是专门寻找的 - 我甚至不确定你是否可以使用对象,这真的很糟糕 - 但这绝对是一个开始。


关于编译错误:

  • salarydouble[]。数组中包含许多不同类型double的值,但double[]不是直接double。从数组类型中分配非数组类型不起作用,从技术立场和语义立场 - 您正在采取可以包含许多值并尝试将其分配给可容纳一个值的容器的内容。

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