我正在尝试为游戏构建搜索功能,以便用户可以看到一种类型的生物(物种,性别和状态效果,如健康和能量)。这种搜索将经常运行 - 它几乎是不断的,所以它需要尽可能地优化。
我可以使用地图,集合,数组等等。我愿意改变程序的其余部分,以使这个流程更流畅。我目前的策略是一堆HashMaps试图充当易于搜索的索引,而不是遍历牧场中的每一个生物。我花了两天时间阅读了太多的Map和List变体,但是它们似乎都没有让我有能力快速检查列表A中的每个项目以查看它是否包含列表B的成员。这样的索引是否可行Java,还是我应该放弃索引并迭代大对象并立即检查所有条件?
我很确定我完全错了,但我记得你们都喜欢看上下文的错误代码,所以这里是:
public static HashMap<Integer, Creature> creatures = new HashMap<Integer, Creature>();
public static HashMap<Integer, Species> species = new HashMap<Integer, Species>();
public static HashMap<Integer, Integer> gender = new HashMap<Integer, Integer>();
public static HashMap<Integer, Integer> health = new HashMap<Integer, Integer>();
public static HashMap<Integer, Integer> energy = new HashMap<Integer, Integer>();
public static void newCreature (Creature creature) {
creatures.put(indexPos, creature);
species.put(indexPos, creature.species);
gender.put(indexPos, creature.gender);
health.put(indexPos, creature.health);
indexPos++;
}
public static void searchBy(EnumSet<Species> speciesInclude, boolean[] genderInclude) {
Integer[] index = creatures.keySet().toArray(new Integer[0]);
if (!speciesInclude.isEmpty() && speciesInclude != EnumSet.allOf(Species.class)) {
for (Integer i : index) {
if (!speciesInclude.contains(species.get(i))){
//remove element from array
}
}
}
if (genderInclude[0] != genderInclude[1]) {
for (Integer i : index) {
if (genderInclude[gender.get(i)]) {
//remove element from array
}
}
}
//TODO check against health
//TODO check against energy
//TODO check against more things
}
为什么是的,我是对Java完全陌生,并以PHP / SQL的方式思考。
答案 0 :(得分:0)
没有人在回答表中发布此内容,因此我会将其从“未答复”中删除。列表:
不,Java不是数据库程序,因此没有类似JOIN的选项。迭代对象并检查它们的字段要快得多 - 这不是Java中的困难操作。
如果有一个经常被搜索的类别,可以将对象存储在单独的列表中,例如:Map&gt;,但简单的方法很好。谢谢Radiodef的帮助。