0

我正在做一个项目,我的程序是从文本文件中读取有关员工的某些信息(ID、名字和姓氏、可用日期、年薪等)。我创建了一个员工类,以及hashCodeequals方法以及所有的getter、setter、变量声明等等。
我遇到的问题是在主课上。这是我的代码:

public static void main(String[] args) throws FileNotFoundException {
    ArrayList<Employee> db = new ArrayList<>();
    try {
        Scanner fin = new Scanner(new File("employeeDB.txt"));
    } catch (FileNotFoundException e) {
        System.out.println(e);
    }

    Scanner fin = new Scanner(new File("employeeDB.txt"));
    while (fin.hasNextLine()) {
        String line = fin.nextLine();
        String[] fields = line.split(",", 0);
        Employee emp = new Employee(Integer.parseInt(fields[0]), fields[1],
                fields[2], fields[3], fields[4], Integer.parseInt(fields[5]),
                Boolean.parseBoolean(fields[6]), fields[7], fields[8],
                Double.parseDouble(fields[9]), fields[10]);
        db.add(emp);
    }

    listAllEmployee(db);
    System.out.println("");
    listAllEmployeeEidAndName(db);

}
public static void listAllEmployee(ArrayList<Employee> list) {
    System.out.println("List all employees:");
    for (Employee emp : list) {
        System.out.println(emp);
    }
}

public static void listAllEmployeeEidAndName(ArrayList<Employee> list) {
    System.out.println("List all empoyee eid and name:");
    for (Employee emp : list) {
        System.out.println("Employee{eid=" + emp.getEid()
                + ", firstName=" + emp.getFirstName()
                + ", lastName=" + emp.getLastName());
    }
}

public static void listEmployeeByField(ArrayList<Employee> list,
        int field) {
    }

我不确定如何做最后一种方法。我唯一的想法是以与我为该listAllEmployeeEidAndName方法所做的类似的方式编写一个巨大的 switch 语句,但这似乎不切实际。

有没有办法让它删除字段并只显示listEmployeeByField调用方法时给出的字段?

4

4 回答 4

0

您可以创建一个将字段映射到员工列表的映射。就像是:

Map<String, List<Employee>> map = new HashMap<String, List<Employee>>();

for(Employee e : list)
{
   if(e.containsKey(e.getField())
   {
      List<Employee> list = map.get(e.getField());
      list.add(e);
      map.put(e.getField(), list);
   }
   else
   {
      List<Employee> list = new ArrayList<Employee>()l
      list.add(e);
      map.put(e.getField(), list);
   }
}

最后,您可以遍历地图的键并按字段打印出所有员工。

于 2013-02-26T16:55:21.757 回答
0

通过字段,我看到您指的是 id、name 等属性...您可以尝试这样做,因为您已经发现需要使用开关,这是正确的。

public static void listEmployeeByField(ArrayList<Employee> list, int field) {
        for(Employee e : list) {
            switch(field) {
                case 0: System.out.println(e.getId());
                        break;
                case 1: System.out.println(e.getFirstName());
                        break;
                case 2: System.out.println(e.getLastName());
                        break;
                // .... and so on
        }

}
于 2013-02-26T17:00:29.353 回答
0

我会添加这样的方法Employee

public String selectField(int... fields) {
    StringBuilder strb = new StringBuilder("Employee{");
    if (fields.length == 0) {
        strb.append("No fields selected ");
    } else {
        for (int i = 0; i < fields.length; i++) {
            switch(fields[i]) {
                case 0: strb.append("eid=" + id + ","); break;
                case 1: strb.append("firstName=" + firstName + ","); break;
                //... and so on
                default: strb.append("-->Field " + fields[i] + " doesn't exist<--");  
            }
        }
    }
    strb.replace(strb.length() - 1, strb.length(), "}");
    return strb.toString();
}

并像这样编写您的方法:

public static void listAllEmployeeByField(List<Employee> list, int... fields) {
    System.out.println("Listin all empoyee by fields "+ Arrays.toString(fields) + ":");
    for (Employee emp : list) {
        System.out.println(emp.selectField(fields));
    }
}
于 2013-02-26T17:02:40.943 回答
0

最简单的方法是在 Employee 类中存储一个字符串数组 - fields[],其中位置“field”的值是字段(字符串)的名称。例如,假设“ID”是存储在 0 的字段,“Name”是存储在位置 1 的字段,那么您的 fields 数组在内存中将如下所示:

字段 = {"Id","Name", ...... ,}

然后你需要做的就是在正确的位置打印字符串:

public static void listEmployeeByField(ArrayList list, int field) {

    for (Employee emp : list) 
    System.out.println(emp.fields[field]);

}

通过将 main 中的字符串数组“fields”传递给类构造函数,您可以在为类的其他成员赋值的同时构造这个数组。

于 2013-02-26T17:20:58.283 回答