-1

私はすべて、以下のタイプのデータを含むExcelシートを持っています。

  01-Aug-2012   EST213  Sowmya  Shivashankar    11  0   11  4   0   LOP
  01-Aug-2012   EST101  Prashanth  P    12  8   20  5   5.28    0     Half-day
  08-Aug-2012   EST213  Sowmya  Shivashankar    11  0   11  4   0   LOP

ここでは、1人の従業員の1日のデータを提供しています。このように、1か月で約3000行のデータがあります。特定の従業員の月のLOPまたは半日数をカウントする必要性を計算する必要があります。

4

2 に答える 2

1

従業員とその月次エントリ間のマッピングを試すことができます。
注:これはほぼ完全なコードですが、行や月番号の解析など、自分で行う必要がある部分もあります。

class EmployeeEntry {
    String date;
    String name;
    String surname;
    // other fields representing excel columns

    TYPE_OF_DAY typeOfday;

    public static enum TYPE_OF_DAY {
        LOP, HALF_DAY, OTHER
    }

    public String getEmployeeID() {
        // you may return name+surname or some unique ID
        return name + " " + surname;
    }

    public Integer getMonth() {
        String monthStr = date.split("-")[1];
        return asMonthNumber(monthStr);
        // implement asMonthNumber to convert Aug --> 08
    }
}

public class A {

    private Map<String, Map<Integer, List<EmployeeEntry>>> entries;

    public void parseExcel(HSSFSheet sheet) {
        entries = new HashMap<String, Map<Integer, List<EmployeeEntry>>>();
        Iterator<Row> iter = sheet.iterator();
        // for every row
        while (iter.hasNext()) {
            Row row = iter.next();
            // parse will call getString, getNumber etc of the current row
            EmployeeEntry entry = parse(row);
            Map<Integer, List<EmployeeEntry>> userMonthlyEntriesMap = getOrCreate(entry
                    .getEmployeeID());
            List<EmployeeEntry> monthlyEntries = getOrCreate(
                    userMonthlyEntriesMap, entry.getMonth());
            monthlyEntries.add(entry);
        }
    }

    public int countLOP(String employeeID, Integer monthNum) {
        int counter=0;

        Map<Integer, List<EmployeeEntry>> map = entries.get(employeeID);
        if (map != null) {
            List<EmployeeEntry> list = map.get(monthNum);
            if (list != null) {
                for (EmployeeEntry entry : list) {
                    if (entry.typeOfday == EmployeeEntry.TYPE_OF_DAY.LOP) {
                        counter++;
                    }
                }
            }
        }
        return counter;
    }

    private List<EmployeeEntry> getOrCreate(
            Map<Integer, List<EmployeeEntry>> userMonthlyEntriesMap,
            Integer month) {
        List<EmployeeEntry> monthlyEntries = userMonthlyEntriesMap.get(month);
        if (monthlyEntries == null) {
            monthlyEntries = new LinkedList<EmployeeEntry>();
            userMonthlyEntriesMap.put(month, monthlyEntries);
        }
        return monthlyEntries;
    }

    public Map<Integer, List<EmployeeEntry>> getOrCreate(String emplID) {
        Map<Integer, List<EmployeeEntry>> entryList = entries.get(emplID);
        if (entryList == null) {
            entryList = new HashMap<Integer, List<EmployeeEntry>>();
            entries.put(emplID, entryList);
        }
        return entryList;
    }
}
于 2012-11-23T13:40:35.027 に答える
1

私はこのようにします:

  1. を作成するHashMap<String, List>
  2. XLS ファイルを 1 行ずつ解析する
  3. EmployeeNameおよび (LOPまたはHalf-day) を連続して検索
  4. 従業員名のマップにno がない場合はInteger、新しいペアを作成し、LOPまたはを追加しますHalf-Day。がある場合はList、それに新しいレコードを追加します。
  5. XLS 解析が完了したら、マップから従業員名を取得し、配列に格納されているキーをカウントします。

または、次のような構造を作成できます

{ 
  Integer lop;
  Integer halfDay;
}

リストの代わりに。

于 2012-11-23T13:00:21.340 に答える