0

私は、プログラムが従業員に関する特定の情報 (ID、姓名、利用可能な日付、年収など) をテキスト ファイルから読み取るプロジェクトを行っていhashCodeますequals。すべてのゲッター、セッター、変数宣言など。
私が抱えている問題は、メインクラスにあります。これが私のコードです:

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フィールドを削除して、メソッドが呼び出されたときに指定されたフィールドのみを表示する方法はありますか?

4

4 に答える 4

0

これを行う最も簡単な方法は、文字列の配列を格納することです - fields[] を Employee クラスに格納します。ここで、'field' の位置の値はフィールド (文字列) の名前です。たとえば、「ID」が 0 に格納されたフィールドで、「名前」がロケーション 1 に格納されたフィールドであるとすると、フィールド配列はメモリ内で次のようになります。

fields = {"ID","名前", ...... ,}

次に、正しい場所に文字列を出力するだけです。

public static void listEmployeeByField(ArrayList リスト, int フィールド) {

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

}

メインの文字列配列 'fields' をクラス コンストラクターに渡すことにより、クラスの他のメンバーに値を割り当てると同時に、この配列を構築できます。

于 2013-02-26T17:20:58.283 に答える
0

フィールドごとに、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
        }

}
于 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

フィールドを従業員のリストにマップするマップを作成できます。何かのようなもの:

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 に答える