1

这不是我如何从集合中获取对象的另一种方法。我有一个困扰我的困境。我会尽力把问题解释清楚。

我正在开发一款游戏,这款游戏围绕着玩家照顾宠物展开。我已经决定有一个玩家宠物的arrayList是合适的。(所以 ArrayList allPets 等......在玩家类)

我的问题是,当玩家想要对他/她的宠物做某事时,例如喂它,我如何才能确切知道在 arrayList 的 get 方法中使用哪个索引,以便喂正确的宠物?

这可能是一个简单的问题,但它让我感到困惑,我正在装配玩家和宠物之间的所有方法,但它让我明白了我如何才能真正知道哪个宠物对象被点击了。目前,我只是传入了一个我为测试方法而创建的宠物对象。当涉及到屏幕上的实际宠物对象时,这不会削减它......

任何见解将不胜感激!

4

1 回答 1

2

给 Pet 对象一个唯一的主键。整数 ID 字段很流行,非常高效且足以处理除最大交易量之外的所有交易。

然后,您可以维护一个 Map 并通过 ID 有效地获取 Pets。这种模式可以在整个模型中使用。

对于由 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 来保留 Pets 的顺序,而不必同时保留 List;但是它将 getPets() 返回类型从 List 更改为 Collection,这有点不太好。

KeyAllocator.alloc() 使您能够重用分配逻辑;基本上它应该从 1 开始并在“同步”块内递增。(避免使用 0,因为如果您曾经使用持久层存储数据,0 往往意味着“新”。)

于 2013-05-04T04:21:23.523 回答