web-dev-qa-db-ja.com

Excelの列名とその値を保持するデータ構造

私はJavaでExcelワークブックを読む方法を学び、列名とその下の値を保持するための適切なデータ構造が何であるかを知りたいです。

例:Excel Sheet

メソッドgetColumnValue(String columnName, int indexOfValue)を呼び出して、指定した列名のその位置にある値を取得できるようにしたいと思います。

リンクリストを含むハッシュテーブルを考えていました。ただし、列とそれに関連付けられた値はいくつでも存在する可能性があるため、これは大きなオーバーヘッドのように見えます。

このための良い推奨は何でしょうか?前もって感謝します!

2
Vylic

プログラムが実行時に特定の列構造に関連付けられていない一般的なソリューションが必要であると想定すると、ArrayListの行を使用できます。各行は文字列配列String[]です。列名の列インデックスへのマッピングを格納するには、追加のHashTable<String,int>が必要です(HashMapもおそらく機能します)。だからあなたが持っているなら

 HashTable<String,int> columnMapping;
 ArrayList<String[]> tableValues;

あなたはgetColumnValueを実装することができます

 String getColumnValue(String columnName, int indexOfValue)
 {
     return tableValues.get(columnMapping.get(columnName))[indexOfValue];
 }

ここにいくつかのエラー処理、列名を決定するコード、Excelの行を列ごとに1つのエントリを持つString配列に読み込むコードを追加することを検討してください。型付きフォームの値が必要な場合は、String[]行をObject[]で置き換え、セルの内容を型StringIntegerDoubleまたはDateのオブジェクトとして保存することを検討してください。特定の要件があり、コンテンツ要素に特定の動作またはメソッドを実装する必要がある場合は、特定のクラスCellContentを実装して、行をCellContent[]配列として格納することもできます。

これは汎用ソリューションの大まかなスケッチです。より具体的な要件に応じて、これを変更してさまざまなバリアントを作成できます。

lessジェネリックバリアントが必要な場合、プログラムは特定の列構造を想定しているため、行の特定の値を保持するための特定のDTOクラスMyRowTypeを作成し、ArrayList<MyRowType> tableValuesのような変数を使用することが最善の解決策です。テーブルのコンテンツを格納するため。

1
Doc Brown

パフォーマンスが必要な場合は、おそらく列の値を保持する配列が必要です。それ以外の場合は、1。メモリオーバーヘッドが発生し、2。より低い行へのアクセスが遅くなります。

列は、ハッシュマップ(名前->配列)または直接オブジェクトフィールドのいずれかです(後者が望ましいですが、フィールドとタイプが静的に認識されている必要があります)。

これは、すべての列のタイプが同じであり、各列がしばしば/常に入力され、同じデータを表すと仮定する基本的な列ベースの回答になります。データがより疎な場合は、行ごとに格納できます。各行は1つのハッシュマップ(列名->値)であり、配列またはハッシュマップに格納できます。

0
Arthur Havlicek