代码可以工作,但不是期望的输出,需要帮助调试(Java)[新程序员:D]

代码可以工作,但不是期望的输出,需要帮助调试(Java)[新程序员:D],java,output,text-files,Java,Output,Text Files,创建一个控制台应用程序,该应用程序将读取两个文件(employees.txt和managers.txt)的内容 应用程序应该使用地图数据结构存储有关部门的信息 应创建以下类: -包含姓名、姓氏和工资(每月)信息的员工类 -经理类,包含关于名字、姓氏、工资(每月)和年度奖金(占工资的百分比)的信息 使用继承创建类 将以下报告输出到单独的文件中: -每个部门的平均工资,例如营销1000,生产2000 -支付该部门所有工资所需的总金额 -所有经理的年度奖金金额 -每个部门员工的最高工资*及其姓名 -每

创建一个控制台应用程序,该应用程序将读取两个文件(employees.txt和managers.txt)的内容

应用程序应该使用地图数据结构存储有关部门的信息

应创建以下类:

-包含姓名、姓氏和工资(每月)信息的员工类

-经理类,包含关于名字、姓氏、工资(每月)和年度奖金(占工资的百分比)的信息

使用继承创建类

将以下报告输出到单独的文件中:

-每个部门的平均工资,例如营销1000,生产2000

-支付该部门所有工资所需的总金额

-所有经理的年度奖金金额

-每个部门员工的最高工资*及其姓名

-每个部门员工的最低工资*及其姓名

*可以有一个或多个员工薪酬最高

*可以有一个或多个员工的工资最低

注意:每个部门可以有多个经理

其中一个输出错误,应该是这样的:

在市场营销领域薪水最高的人是:约翰·普罗迪克

但我得到的却是:

在市场营销领域薪水最高的人是:约翰·普罗迪和帕西·拉普拉德

以下是我对代码的尝试:

注:scp=扫描仪生产,scm=扫描仪营销,hsp=最高工资生产,lsp=最低工资生产,hsm=最高工资营销,lsm=最低工资营销,salPro=工资生产,salMar=工资营销,emp=员工

以下是文本文件(managers.txt和employees.txt)


尽管代码“正常工作”,但它不满足所述要求:

  • 它不使用
    Map
    结构在运行时维护其数据。相反,数据存储在两个
    ArrayLists
    中,
    Map
    仅用作“跳转表”,记住某些员工的索引以帮助处理特定值
  • 有关总工资和最高/最低工资的报告必须输出到文件,而不是控制台。然而,这与问题中讨论的问题无关
  • 一个条件是“一个或多个员工”的工资最高/最低。该守则只处理“一名或两名雇员”的特殊情况

对于
Map
部分,作业的作者可能会试图用此限制来指导您。现在,您得到了一些接近解决问题的代码,很明显,由于您在两个文件中处理两个部门,您最终复制了大量的部分

在这一点上,我们希望减少这种逻辑,使单个代码段能够找到所需的薪资值和员工,而不考虑部门。
Map
怎么能帮上忙呢


我喜欢的代码是方便的构造函数,比如

public Employee(String[] list) {
    this(list[0], list[1], list[2], Integer.parseInt(list[3]));
}
在更大的程序中,这种逻辑不应该绑定到指定用于保存业务数据的类,但目前它还可以。它允许在需要时快速使用
员工的逻辑

String[] input = ...
Employee fromInput = new Employee(input);
System.out.println("Hi, I'm " + fromInput.getFullName() + ", currently working at ...");
然而,在大多数程序中,您使用的是在输入过程中解析的
字符串[]obj
,这是一些评论者已经指出的代码模糊的部分原因

在java中,对象引用非常轻量级,因此下面代码示例中的第三行对性能的影响最小

Employee cursor = ...
if(cursor.getSalary() > ...) {
    Employee theOneWithHighestSalary = cursor;
    // do something with it
}
因此,尽可能尝试改装代码以使用
Employee
的实例。首先是为了可读性,但也为了以后的扩展性


最后但并非最不重要的一点是,主要描述了不当失效的错误结果

目前,该准则能够找到一名或两名薪酬最高/最低的员工。如果在算法中的任何一点上,只有一名这样的员工是已知的,则称之为
hsp
/
lsp
,等等。如果找到另一名薪酬相同的员工,则称之为
hsp1
,等等


但是,如果发现另一名员工的工资高于
hsp
,则仅更新有关
hsp
的信息,并且
hsp1
保持不变,错误地指代工资较低的员工。相反,此时必须清除有关hsp1的信息。

请选择一个合适的标题,您显然在标题中添加了一些内容,因为不允许只使用“代码工作,但不是期望的输出”。如果您将
obj[x]
从扫描分配到实际,有意义的变量。抱歉,在代码之前添加了变量的含义。我自己解决了,谢谢你的关注!不,它们都需要在代码中,如果您的代码需要手册,那么您就犯了严重错误。使用IDE重构所有名称和神奇字符串。
package com.company;

public class Person {
    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }
}
Marketing, John, Prodigy, 5300, 15
Production, Boss, Old, 2000, 20
Production, Bossic, Young, 1400, 20
Ginny, Gullatt, Marketing, 1000
Tiara, Curd, Production, 1200
Camie, Poorman, Marketing, 900
Jammie, Hasson, Marketing, 800
Lionel, Hailey, Marketing, 500
Genevive, Mckell, Production, 2000
Esteban, Slaubaugh, Marketing, 1300
Elden, Harte, Production, 1340
Tasia, Rodrigue, Marketing, 1200
Nathanial, Dentler, Production, 1700
Valda, Nicoletti, Marketing, 600
Kary, Wilkerson, Production, 600
Coletta, Akey, Marketing, 800
Wilmer, Jack, Production, 600
Loreta, Agnew, Marketing, 700
Suzy, Cleveland, Production, 1450
Pasty, Laprade, Marketing, 1300
Candie, Mehaffey, Production, 1800
Glady, Landman, Marketing, 1900
Tierra, Mckeown, Production, 2200
public Employee(String[] list) {
    this(list[0], list[1], list[2], Integer.parseInt(list[3]));
}
String[] input = ...
Employee fromInput = new Employee(input);
System.out.println("Hi, I'm " + fromInput.getFullName() + ", currently working at ...");
Employee cursor = ...
if(cursor.getSalary() > ...) {
    Employee theOneWithHighestSalary = cursor;
    // do something with it
}