我正在做一个项目,我的程序是从文本文件中读取有关员工的某些信息(ID,名字和姓氏,可用日期,年薪等)
我创建了一个员工类,以及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) {
}
我不确定如何做最后一种方法。我唯一的想法是以类似于listAllEmployeeEidAndName
方法的方式编写一个巨大的switch语句,但这似乎不切实际。
有没有办法让它删除字段,只显示调用listEmployeeByField
方法时给出的字段?
答案 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”传递给类构造函数,可以在将值赋值给类的其他成员的同时构造此数组。