这不是另一种如何从集合中获取对象的方法。我有一种困扰我的困境。我会尽力清楚地解释这个问题。
我正在制作游戏,这个游戏围绕着照顾宠物的玩家。我已经决定拥有一个玩家宠物的arrayList是合适的。 (所以ArrayList allPets等......在玩家类中)
我的问题是当玩家想要与他/她的宠物做某事时,例如提供它如何确切地知道在arrayList的get方法中使用哪个索引,以便我提供正确的宠物?
这可能是一个简单的问题,但令我困惑的是,我正在操纵玩家和宠物之间的所有方法,但是我明白我将如何知道哪个宠物对象被点击了。目前我只是传递了一个宠物对象,我为了测试方法而创建了这个对象。当谈到屏幕上的实际宠物物体时,这不会削减它......
非常感谢任何见解!!
答案 0 :(得分: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来保留Pets的顺序,而不必保留List;但它将getPets()的返回类型从List更改为Collection,这有点不太好。
KeyAllocator.alloc()使您可以重用分配逻辑;基本上它应该从1开始并在同步的内部增加。块。 (避免使用0,因为如果您使用持久层存储数据,则0往往意味着新的&#39;。)