2

私は友達と一緒にビデオゲームに取り組んでいます。さまざまなタイプのアイテムを説明するために、元々、Itemクラスを拡張する各アイテムのクラスがありました。これらのクラスには多くのデータがなかったので、ワークスペースがそれほど乱雑にならないように、別の方法を探していました。私はHashMapについて学び始めましたが、HashMapはアイテムを追加するための素晴らしい方法だと思いました。また、intを使用してHashMapのアイテムにアクセスする代わりに、基本的にはArrayListにするように設定することもできます。これにより、Stringsを使用してアイテムにアクセスできるようになります。そこで、この機能を追加し、Itemクラスに匿名のアイテムを作成し始めました。

    private static Item coal = new Item() {
        weight = .2;
        setImageID(0, 16);
    }

それらをHashMapに追加します。

    itemMap.put("Coal", coal);

これらのいくつかを実行した後、リストには各タイプのアイテムが1つしかないことに気付きました。元のアイテムを変更せずに変更できるアイテムが複数ある場合は、コピーを作成する必要があります。私はそれを行う方法の研究を始めました。コピーコンストラクターを使用することもできますが、Itemには変数が多すぎるため、効率的に実行できません。確かにそれは可能でしたが、簡単な解決策があるのではないかと思いました。すべてのアイテムを最終的なものにできますか?私はこのプログラミング分野にまったく慣れていないので、ただ唾を吐いているだけです。私たちもこのすべてを間違ってやっている可能性があります。HashMapを使用して、リスト内の無期限のアイテムにアクセスするために使用できる「アイテムデータベース」のようなものを作成する方法が必要です。助言がありますか?

4

4 に答える 4

5

セットの値を持つ HashMap (または同じアイテムが複数回存在できるかどうかに応じてリスト) を持つことはどうですか?

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

そうすれば、各タイプに複数のアイテムを含めることができます。

タイプのセットに新しいアイテムを追加するための 1 つのイディオムを以下に示します。

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);。これにより、タイプミスや大文字と小文字の区別の問題を防ぐことができます。

于 2012-03-08T16:56:20.800 に答える
0

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

于 2012-03-08T16:56:49.587 に答える
0

次のようなステートメントでマップを指定できることをご存知でしたか?

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

また

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

アイテムの各セット/配列/リストを整数または文字列に関連付けると、問題が解決する可能性があります。

于 2012-03-08T16:59:56.447 に答える
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 が記述したものは、パフォーマンスの低下とメモリ使用量の増加というトレードオフで、より単純で、記述するコードが少なくなります。

于 2012-03-08T17:00:26.543 に答える