2011-12-26 10 views
1

すべてのフィールドに特定の型があるフィールドのコレクションを持つオブジェクトを作成する必要があります。 (フィールドの数と種類が変わります) 型は「一般的」です。文字列、日付、ロング、インツ、ブール動的型フィールドを持つオブジェクト

キャスティングを避けるために、値を型として保存します。

ここでは値がオブジェクトの場合はHashmap(非汎用)を使用します。

しかし、ハッシュマップは遅くて重いです(私はそれらをたくさん使います)。

どうすればよいですか?

ハッシュマップは、すべての列が独自の型を持つ表の行の構造を表します。私は

+2

あなたの投稿を編集してください。私の意見では、あなたがしようとしていることは明らかではありません。特に使用されているデータの種類と、これをやっている理由。 – fuzzy

+0

ファジー、ハッシュマップは、すべての列が独自の型を持つ表の行の構造を表します。私は列の型として値を格納したい – simpleuser

+0

私が言ったように、あなたの投稿を編集してください。それはまだ(文法的に)正しくはなく、書式も改善される可能性があります。いくつかの追加情報を追加したり、状況を異なる方法で記述してみてください。 – fuzzy

答えて

2

を参照してください列の型として値を格納します。

HashMapデータ構造はO(1)です。なぜあなたは彼らが「遅くて重い」と思うのか分かりません。あなたが他のデータ構造がより適切な場所でそれらを過度に使用しているかもしれないように思えます。

+0

私がしていることは、あるハッシュマップから別のハッシュマップ(ハッシュマップのコレクション)への「深い」コピーがたくさんあることです。そのためには毎回すべての値を繰り返して別のハッシュマップに入れなければなりません – simpleuser

1

クラスのフィールドに動的にアクセスするには、リフレクションやApache BeanUtilsクラス(Java BeanをMap for YOUに変換できる)を使用するのが慣習的です。 )はマップ内のオブジェクトを単純にエンコードします。

あなたが本当に尋ねているような音です。どのようにして、動的にエンコードされたデータを一般的に処理できますか?これはjavaの一般的な作業です。通常、変数に正確な型のデータをエンコードしないので、イントロスペクションが必要です。イントロスペクションを使用することで、コードベースを非常に簡単に一般化することができます。

あなたがマップに

を単純な名前/値のタプルとして設定ラージオブジェクトをエンコードしたい場合は、各マップにはいくつかのフィールドを持つオブジェクトをエンコードし、大きな「マップのリスト」を作成するのソリューションは、さ効果的です。多くの場合、データモデルを作成する前に、データモデルのプロトタイプ作成や、XMLまたはJSONオブジェクトでいっぱいのファイルの最初の解析を行うために行われます。いずれにせよ、あなたはむしろ正しいタイプとしてオブジェクトを格納ていることを確認し、その種類ごとにオブジェクト「名前」にする必要はありません、そして、あなたは簡単代わりに型推論を使用することができます。

List<HashMap<String,Object>> my objects = new ArrayList<HashMap<String,Object>>(); 
HashMap<String,Object> h = new HashMap<String,Object)(); 
h.put("SSN",new Integer(2224441234)); 
h.put("username","jayunit100"); 
myObjects.add(h); 

//Now, you can easily identify String vs integer values using introspection : 
HashMap<String,Object> h = myObjects.get(0); 
//You will need to iterate through the entries of the map as follows, 
//And use intropection to process each type as you see fit. 
for(Entry e : h.entries) 
{ 
    Object o = e.getValue(); 
    if(o instanceof Integer) 
     System.out.println(e.getName() + " was an int! that was easy !"); 
    else 
     System.out.println(e.getName() + " was another (non int) type : " + o.getClass().getName()); 
} 

をこのように、任意のプロパティを持つオブジェクトの大規模なコレクションを簡単に作成することができます。これらのプロパティのタイプは、マップ内のどのような方法でもエンコードする必要はありません。次に、javaのイントロスペクションを使用して、実行時に型が何であるかを調べることができます。

あなたが動的にフィールドにアクセスしたい場合は、特定の変数名とフィールドタイプ

にコーディングする必要がないように例えば、データベースクエリの構築やラージオブジェクトcolletionsをデバッグこれは、一般的です。これらのタスクは、フィールド/値を単純な書式付きテキストで名前の値のペアとしてリストする必要があることがよくあります。これを行うには、型をマップとしてではなくオブジェクトとして格納し、Apache BeanUtilsライブラリを使用してそれらのオブジェクトをマップに変換するか、BeanUtils.describeのエントリを繰り返してすべてのフィールドに対して操作を動的に行うことをお勧めします( myObject)メソッドを使用します。あなたが大規模な操作の種類に非常に高速なアクセス

をしたい場合は

あなたは、大規模な配列に格納することができますし、データをエンコード/最適化します。あなたが非常に計算集約的なI/Oまたは計算を実際に行っていない限り、これは悪い考えです。

最終ノート:内容を分析/印刷/出力するときに、キー/値のペアが同じ順序で出現するように、ハッシュマップの代わりにTreeMapsを使用することができます。

0

ではなく、ハッシュマップ内の各時間のオブジェクトの種類を格納し、何を行うことができますが、あなたが 1として使用したいすべての種類の指標である)一般
2)文字列
3)日
4)ロング
これらは10以下のリストになります。型と呼ばれるarrayListにオブジェクトを格納します。IndexOf

を使用して上記のタイプのインデックスをチェックし、それぞれのタイプのオブジェクトをArrayListの配列、

ArrayList [] myobjects;

およびuは、文字列オブジェクトを格納する場合、myobjectsに入れて、[3](.add) とのArrayListからの読み取り中に適切な型キャストを行います。

ここで、myobjects [0] --->はすべての一般オブジェクトを格納します。 myobjects [1] ----->すべてのStringオブジェクトなどを格納します。

このようにして、すべてのStringオブジェクトを一般的なオブジェクトと区別し、安全に型変換することができます。

0

HashMapsを使用する唯一の本当の方法は、バイトコードを使用して生成されたデータ型を使用することです。不幸にも多くの作業がありますが、2〜3倍小さく高速です。しかし、これが必要な場合は、必要なフィールドのスーパータイプでなければならない場合でも、具体的なタイプの再考をお勧めします。

関連する問題