Java 显示已删除字段的ArrayList

Java 显示已删除字段的ArrayList,java,arraylist,Java,Arraylist,我正在做一个项目,在这个项目中,我的程序是从文本文件中读取有关员工的某些信息(ID、姓名、可用日期、年薪等) 我创建了一个employee类,以及hashCode和equals方法以及所有的getter、setter、变量声明等等。 我遇到的问题是在主课上。这是我的密码: public static void main(String[] args) throws FileNotFoundException { ArrayList<Employee> db = new Arra

我正在做一个项目,在这个项目中,我的程序是从文本文件中读取有关员工的某些信息(ID、姓名、可用日期、年薪等) 我创建了一个employee类,以及
hashCode
equals
方法以及所有的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) {
    }
publicstaticvoidmain(字符串[]args)抛出FileNotFoundException{
ArrayList db=新的ArrayList();
试一试{
扫描仪fin=新扫描仪(新文件(“employeeDB.txt”);
}catch(filenotfounde异常){
系统输出打印ln(e);
}
扫描仪fin=新扫描仪(新文件(“employeeDB.txt”);
while(fin.hasNextLine()){
字符串行=fin.nextLine();
字符串[]字段=行。拆分(“,”,0);
Employee emp=新员工(整数.parseInt(字段[0]),字段[1],
字段[2]、字段[3]、字段[4]、整数.parseInt(字段[5]),
Boolean.parseBoolean(字段[6]),字段[7],字段[8],
Double.parseDouble(字段[9]),字段[10]);
db.add(emp);
}
名单雇员(db);
System.out.println(“”);
ListalEmployeeeIDandName(db);
}
公共静态无效列表员工(ArrayList列表){
System.out.println(“列出所有员工:”);
对于(员工emp:列表){
系统输出打印项次(emp);
}
}
公共静态无效列表AllEmployeeeIDandName(ArrayList列表){
System.out.println(“列出所有员工的eid和姓名:”);
对于(员工emp:列表){
System.out.println(“Employee{eid=“+emp.getEid())
+“,firstName=“+emp.getFirstName()
+,lastName=“+emp.getLastName());
}
}
公共静态void listEmployeeByField(ArrayList列表,
整型字段){
}
我不确定如何使用最后一种方法。我唯一的想法是以类似于我对
listalEmployeeeIDandName
方法所做的方式编写一个巨大的switch语句,但这似乎不切实际


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

您可以创建一个映射,将字段映射到员工列表。类似于:

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);
   }
}
Map Map=newhashmap();
对于(员工e:列表)
{
if(e.containsKey(e.getField())
{
List=map.get(如getField());
列表.添加(e);
put(例如getField(),list);
}
其他的
{
List List=new ArrayList()l
列表.添加(e);
put(例如getField(),list);
}
}

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

按字段我看到您指的是id、名称等属性。您可以尝试这样做,因为您已经知道需要使用开关,这是正确的

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
        }

}
publicstaticvoidlistemployeebyfield(arraylistlist,int字段){
对于(员工e:列表){
开关(现场){
案例0:System.out.println(e.getId());
打破
案例1:System.out.println(e.getFirstName());
打破
案例2:System.out.println(e.getLastName());
打破
//……等等
}
}

我想在
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();
}
公共字符串选择字段(int…字段){
StringBuilder strb=新的StringBuilder(“员工{”);
如果(fields.length==0){
strb.append(“未选择任何字段”);
}否则{
for(int i=0;i默认值:strb.append(“-->Field”+fields[i]+”不存在最简单的方法是在Employee类中存储字符串数组-fields[],其中“Field”位置的值是字段(string)的名称。例如,“ID”是存储在0和“name”位置的字段“是存储在位置1的字段,那么您的字段数组在内存中的外观如下所示:

字段={“Id”,“Name”,“…,}

然后,只需在正确的位置打印字符串:

公共静态void列表EmployeeByField(ArrayList列表,int字段) {

}

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

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));
    }
}
    for (Employee emp : list) 
    System.out.println(emp.fields[field]);