1

これは、コレクションからオブジェクトを取得する別の方法ではありません。私には、私を悩ませている苦境があります。問題を明確に説明するために最善を尽くします。

私はゲームに取り組んでいます。このゲームは、ペットの世話をするプレイヤーを中心に展開しています。私は、プレイヤーのペットの arrayList を持つことが適切であると判断しました。(したがって、プレイヤー クラスの ArrayList allPets など)

私の問題は、プレーヤーが自分のペットで何かをしたいときです。たとえば、arrayList の get メソッドで使用するインデックスを正確に知るにはどうすればよいので、正しいペットに餌をやることができますか?

これは単純な問題かもしれませんが、私を混乱させます。プレイヤーとペットの間のすべてのメソッドを装備している最中ですが、どのペットオブジェクトがクリックされたかを実際に知る方法に気づきました。現時点では、メソッドをテストする目的で作成したペット オブジェクトを渡しているだけです。画面上の実際のペットオブジェクトに関しては、それはそれをカットするつもりはありません...

どんな洞察も大歓迎です!!

4

1 に答える 1

2

Pet オブジェクトに一意の主キーを指定します。整数 ID フィールドは人気があり、非常に効率的で、最大のトランザクション ボリュームを除いてすべてを処理するのに十分です。

次に、マップを維持し、ID で効率的にペットを取得できます。このパターンは、モデル全体で使用できます。

SQL データベースに支えられた商用アプリケーションでも同様のパターンが使用されますが、検索は Hibernate を介して行われます。

簡単な例:

public class Player {
    protected List<Pet>        petList = new ArrayList();
    protected Map<Integer,Pet> petMap =  new HashMap();

    public List<Pet> getPets() {return petList;}
    public Pet getPetById (int id) {return petMap.get( id);}
    public void addPet (Pet pet) {
        petList.add( pet);
        petMap.put( pet.getId(), pet);
    }
}

public class Pet {
    protected int id;
    // Id;
    public int getId() {return id;}

    // create;  static factory.
    //
    public static Pet createPet() {
        Pet pet = new Pet();
        pet.id = KeyAllocator.alloc("pet");
        return pet;
    }
}

ヒント: LinkedHashMap を使用して、リストを保持しなくても、ペットの順序を保持できます。しかし、getPets() の return-type を List から Collection に変更します。

KeyAllocator.alloc() を使用すると、割り当てロジックを再利用できます。基本的には、1 から開始し、「同期」ブロック内でインクリメントする必要があります。(永続レイヤーを使用してデータを保存する場合、0 は「新規」を意味する傾向があるため、0 は避けてください。)

于 2013-05-04T04:21:23.523 に答える