2012-07-19 17 views
6

私はStringのキーとStringの値を持つHashtableを持っていますが、複数の異なるデータ型を格納できる必要があるプロジェクトのポイントに達しました。たとえば、、StringDateなどをすべて1つに保存する必要があります。Hashtable複数のデータ型を1つのハッシュテーブル変数に格納する方法はありますか?

+3

キーを 'Object'に変更しますか? – Mysticial

+1

get/setを使ってオブジェクトを作成し、そのオブジェクトを追加するのは良い選択ではありませんか?HashTable/ArrayList(または)あなたが興味を持ったコレクションは何ですか?正確なインデックスとデータ型がわからない場合に複数のデータ型を追加すると、クラスキャスト例外が発生します。 – kosa

+0

これは非常に壊れやすいデータ構造のように聞こえます。一般的に達成しようとしていることを説明できますか?誰かがあなたのデータをより良く構成する方法を提案できますか? – Bobulous

答えて

7

HashTableまたは任意のコレクションMapは、intとその他のプリミティブタイプを除き、これを処理できます。プリミティブタイプは保存できません。Object参照のみです。 intIntegerオブジェクトとしてラップする必要があります。

+0

それで、私はそれをそれが格納されたデータ型として取り出すことができますか? – samwell

+2

実際には、いいえ - キャストなしではなく、それはまだ厄介です。異なるタイプのマップを使用するほうがずっと良いでしょう。もっと良いことには、マップの代わりに異なる名前のフィールドを持つクラスを作成するだけです。正しいタイプの –

4

一般データ型Objectを保存することはできますが、プリミティブデータ型は許可されません。

0

HashTableをHashtable<String, Object>に変更し、intを保存する場合は、最初にキャストするか、または自動キャストを使用してIntegerにキャストする必要があります。テーブルからあなたの価値を得た後、タイプを決定するにはif(value instanceof String)などでタイプを決定できます。これはあなたにString型のキーと基本的にObject型(日付、整数、文字列など)の任意の子孫を意味Object型の値を持つマップを与える

+4

タイプキャストする必要はありません。自動ボクシングは自動的に行います(Java 5+)。 – 01es

+3

クラスはHashtableと呼ばれ、2つの型パラメータを取ります.1つではありません。 –

6
Map<String, Object> map = new HashMap<String, Object>() 

。他の答えは、int、booleanなどのプリミティブを使用する代わりに、Integer、Booleanなどの対応するものを使用する必要があるという事実を正しく示しています。get戻り値の型はObjectです。したがって、タイプ情報を正しく処理するのは開発者の責任です。

HashtableとHashMapの違いは何ですか?質問に対する回答はhereです。

4

これは可能ですが、一般的には良い考えではありません。これより多くの場合、型キャストの例外や問題が発生します。

HashTableは、特定のクラスタイプではなく汎用オブジェクトを格納するように設定できますが、検索時の型変換は自動的には行われません。

オブジェクトをコレクションから戻すには、型チェックルーチンのいくつかの形式を開発する必要があります。

保存するクラスの種類ごとに別々のコレクションを作成する方がよいでしょう。

PS:HashTableではなくHashMapを使用することをおすすめします。 HashTableは推奨されていません。

+0

私はそれを知らなかった。 – samwell

関連する問題