显示已删除字段的ArrayLists

时间:2013-02-26 16:49:47

标签: java arraylist

我正在做一个项目,我的程序是从文本文件中读取有关员工的某些信息(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 个答案:

答案 0 :(得分: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);
   }
}

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

答案 1 :(得分: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
        }

}

答案 2 :(得分: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));
    }
}

答案 3 :(得分: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”传递给类构造函数,可以在将值赋值给类的其他成员的同时构造此数组。