0

Excelファイルからデータを読み取り、mysqlのテーブルに保存するプログラムを作成できました。私のプログラムは、各ファイルの最初の行を読み取り、テーブルのフィールドを作成し、残りのデータを各列の値として保存します。それがプログラムで発生するという理由だけで、LinkedHashMap を使用してすべての値を読み取ることにしました。すべて正常に動作します。しかし、プログラムを終了してテストすると、コンソールにエラーが表示されます。マップに以前にキーのマッピングが含まれていた場合、古い値が指定された値に置き換えられるため、エラーは LinkedHashMap によるものです。

データを解析するためのコードは次のとおりです。

private static List<TableRow> parseExcelColumnData(List sheetData) {
        // read each row from 1 to the last
        ArrayList<TableRow> tousRows = new ArrayList<TableRow>();
        for (int rowCounter = 1; rowCounter < sheetData.size(); rowCounter++) {

            List list = (List) sheetData.get(rowCounter);

            LinkedHashMap<String, Integer> tableFields = new LinkedHashMap(list
                    .size());
            String str;
            String[] tousFields = new String[list.size()];

            int i = 0;
            Cell cell = (Cell) list.get(0); // get the first column
            long currentID = (long) cell.getNumericCellValue();
            for (int j = 0; j < list.size(); j++) { //get the rest
                cell = (Cell) list.get(j); 
                if (cell != null) {
                    if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                        ...
                                ...............
                    }
                }
            }
            tousRows.add(new TableRow(currentID, tableFields));
        }

        return tousRows;

    }

古い値を置き換えないように、「tableFields」をArrayListにする方法を教えてください。

4

3 に答える 3

1

ハッシュ マップに同じキーを 2 回配置することはできません。次のような「フィールド」と呼ばれるマップを想像してください: "A => 1"。でキー A にアクセスしfields.get("A")、値が 1 であることを期待します。キー A を再びマップに入れると、「A => 1, A => 2」のようになります。の結果はどうなると思いますfields.get("A")か? この場合、1 を返すか 2 を返すかを決めることはできません。

ここで行うことは、文字列を整数にマップするマップを使用する代わりに、文字列を整数配列にマップする必要があります。コードは次のようになります。

    private static List<TableRow> parseExcelColumnData(List<?> sheetData) {
        // read each row from 1 to the last
        ArrayList<TableRow> tousRows = new ArrayList<TableRow>();
        for (int rowCounter = 1; rowCounter < sheetData.size(); rowCounter++) {

            List<?> list = (List<?>) sheetData.get(rowCounter);

            LinkedHashMap<String, List<Integer>> tableFields = new LinkedHashMap<String, List<Integer>>(list.size());
            String str;
            String[] tousFields = new String[list.size()];

            int i = 0;
            Cell cell = (Cell) list.get(0);
            long currentID = (long) cell.getNumericCellValue();
            for (int j = 0; j < list.size(); j++) {
                cell = (Cell) list.get(j); 
                if (cell != null) {
                    if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                        put(tableFields, String.valueOf(cell.getNumericCellValue()), cell);
                    } else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
                        put(tableFields, cell.getStringCellValue(), cell);
                    } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
                        put(tableFields, String.valueOf(cell.getBooleanCellValue()), cell);
                    } else if (cell.getCellType() == Cell.CELL_TYPE_BLANK) {
                        put(tableFields, cell.getStringCellValue(), cell);
                    }
                }
            }
            tousRows.add(new TableRow(currentID, tableFields));
        }

        return tousRows;

    }

    private static void put(LinkedHashMap<String, List<Integer>> tableFields, String cellValue, Cell cell) {
        if (!tableFields.containsKey(cellValue)) {
            tableFields.put(cellValue, new ArrayList<Integer>());
        }

        tableFields.get(cellValue).add(cell.getCellType());
    }

次に、「A => [1, 2]」のようなマップができます。

于 2013-06-03T07:57:00.530 に答える
0

代わりにIdentityHashMapを使用できます。

put(key,value)への呼び出しをに変更する必要があるかもしれませんput(new String(key), value)

于 2013-06-03T07:57:14.717 に答える