2013-02-26 2 views
0

Я делаю проект, в котором моя программа должна читать из текстового файла определенную информацию о сотрудниках (идентификатор, имя и фамилия, дата, годовой оклад и т. Д.) Я создал класс сотрудников, а также методы hashCode и equals, а также все геттеры, сеттеры, объявления переменных и многое другое.
Проблема, с которой я столкнулся, - это основной класс. Вот мой код:Отображение ArrayLists с удаленными полями

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) { 
    } 

Я не уверен, как это сделать последнему методу. Единственная идея, которую я имел, заключалась в том, чтобы написать огромный оператор switch аналогичным образом, который я сделал для метода listAllEmployeeEidAndName, но это кажется непрактичным.

Есть ли способ удалить поля и отобразить только тот, который задан при вызове метода listEmployeeByField?

ответ

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)); 
    } 
} 
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); 
    } 
} 

В конце концов вы могли бы перебирать ключи карте и распечатать все сотрудники на местах.

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 
     } 

} 
0

Самый простой способ сделать это, чтобы сохранить массив строк - поля [] в вашем классе Employee, где значение в поле «поле» - это имя поля (строки). Например, «Идентификатор» - это поле, хранящееся в 0, а «Имя» - это поле, хранящееся в местоположении 1, тогда ваш массив полей будет выглядеть примерно так:

fields = {"Id", "Name »......}

Тогда все, что вам нужно сделать, это распечатать строку в нужном месте:

государственной статической силы listEmployeeByField (список ArrayList, внутр поле) {

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

Вы можете построить этот массив одновременно с назначением значений другим членам класса, передав в строковый массив «поля» в главном конструкторе класса.

Смежные вопросы