2012-03-08 1 views
2

私は友達とビデオゲームをしています。異なるタイプのアイテムを説明するために、もともとItemクラスを拡張している各アイテムのクラスがありました。これらのクラスにはデータはあまりありませんでしたので、ワークスペースがあまりうまくいかないように代替案を探していました。私はHashMapsについて学び始めました。彼らはアイテムを追加する素晴らしい方法だと思っていました。また、基本的にArrayListにするintを使ってHashMap内の項目にアクセスするのではなく、Stringでそれらをアクセスできるように設定することもできます。そこで、私はこの機能を追加して、Itemクラスの匿名アイテムを作成し始めました。これをHashMapに追加しました。リストからアイテムにアクセスしてコピーする方法としてHashMapを使用するにはどうすればよいですか?

itemMap.put("Coal", coal); 

これらのいくつかを行った後、私は、各タイプの唯一の項目がリストにあったことに気づき、そして私たちが今までオリジナルを変更することなく変更することができ、それらのアイテムの倍数を持っていると思った場合、私たちは、コピーを作成する必要があります。私はそれを行う方法の研究を始めました。コピーコンストラクタを使用することもできますが、効率的に行うには、アイテムに多すぎる変数があります。私たちは確かにそれを行うことができましたが、私は単純な解決策があるかどうか疑問に思っていました。すべてのアイテムを最終的にすることができますか?私はプログラミングのこの分野にまったく新しいので、私はちょうどspitballingです。私たちはこのすべてのことを間違ってやっている可能性もあります。私は、HashMapを使用して、リスト内のアイテムの不定な量にアクセスするために使用できる「アイテムデータベース」の何かを作成する方法が必要です。助言がありますか?

答えて

5

値がセット(または同じアイテムが複数回存在するかどうかに応じてリスト)を持つHas​​hMapはどうでしょうか?

Map<String, Set<Item>> map = new HashMap<String, Set<Item>>(); 

このように、種類ごとに複数のアイテムを設定できます。タイプのセットに新しい項目を追加するための

一つのイディオムは以下の通りです:

Set<Item> items = map.get(type); 
if (items == null) { 
    items = new HashSet<Item>(); 
    items.put(type, items); 
} 
items.add(item); 

それも、あなたのタイプだけではなく文字列のためのEnumを使用することが悪い考えではないかもしれません。次に、あなたは何かをすることができますmap.put(Item.COAL, itemSet);これは、タイプミスや大文字と小文字の区別の問題を防ぐのに役立ちます。

0

Hashmap<string,ArrayList<Item>>はおそらく動作しますか? itemMap.put("Coal", coal)の代わりに、itemMap.get( "Coal")に既に配列リストがあることを確認し、新しい項目をリストに追加する必要があります。

0

あなたはこれらのようなステートメントを使用してマップを指定することができます知っていました:

HashMap<Integer, Item[]> map = new HashMap<Integer, Item[]>(); 

または

HashMap<String, Item[]> map = new HashMap<String, Item[]>(); 

整数や文字列と項目の各セット/配列/リストを関連付けることは、あなたのために働く可能性があり問題。

0

これを正しく理解していれば、各HashMap内のすべてのアイテムのリストを持つ必要があり、アイテムタイプの複数のアイテムにアクセスする必要があります。これを行うには、HashMap<String, ArrayList<Item>>を作成してください。アイテムタイプを最初に作成するときは、新しいArrayList<Item>を作成し、同じアイテムタイプの後続アイテムを追加する場合は、リストに追加するだけです。

しかし、HashMapはそれほど効率的ではありません。アイテムタイプが分かっている場合は、ArrayList<ArrayList<Item>>にして、あなたが持っているアイテムタイプの数と等しいinitialCapacityで外側のArrayListを初期化し、アイテムタイプの名前をインデックスに変換するメソッドを持つようにしますロード・ファクタが不足しているためメモリの効率が良くなるように外部ArrayListに格納され、ハッシュ関数のオーバーヘッドはバイパスされます。アイテムの名前をインデックスに変換するメソッドの代わりに、各アイテムタイプにアイテムタイプIDを追加することもできます。

だから、あなたが持っているでしょう:

class Coal { 
    public int id = 0 
} 

、あなたの外側のArrayListをitemTypesの名前とあなたの項目がcoalであると仮定すると追加が簡単になります:あなたが使用したい実装に

itemTypes.get(coal.id).add(coal) 

あなたの呼び出しHashMapは、パフォーマンスの低下とメモリ使用量の増加とのトレードオフを利用して、書き込むシンプルでコードが少なくなっています。

関連する問題