Java ArrayList子类提取

Java ArrayList subclass extraction

我正在创建一个应用程序,我在其中使用遗传算法(尚未实现)让生物跟随食物并避开障碍物。 我在我的模拟 class(魔术发生的地方)中有一个数组列表,其中存储了所有生物。需要注意的是,arraylist 充满了抽象的 class 对象,而我的生物都是 Creature.

的子class

我的问题是:如何制作另一个 ArrayList 或类似的列表,以便我可以遍历 arraylist 并提取特定的子class?我看了一下,由于 java 集合的工作方式,我似乎无法这样做。是否有任何类型的解决方法或某些库可以使我成为可能?

拥有单独的列表对我来说很重要,因为我需要将行为应用于不同种类的生物并根据生物的 "dna" 权衡它们。 GitHub 整个项目的存储库:https://github.com/Jamesinvi/Animosity/tree/master/Animosity

我试过了,但我得到了所有生物的列表,因为它们都是生物 class

//in PSEUDOCODE i would like to do this:
new ArrayList newlist=new ArrayList<Creature>();
for(Creature old:oldList){
    if (old instanceof CreatureSubclass){
        newlist.add(old);
    }
}

免责声明:我是一名学生,如果这是一个愚蠢的问题,请原谅我,但我正在努力解决这个问题。感谢您的帮助:)

ArrayList <Creature>oldlist=new ArrayList<Creature>();
ArrayList <Creature>newlist=new ArrayList<Creature>();
for(int i=0;i<oldlist.size();i++){
    if (oldlist.get(i) instanceof CreatureSubclass){
        newlist.add(oldlist.get(i));
    }
}

完全同意 OldCurmudgeon 的观点。你不应该提取 subclass.

如果你真的想这样做,一个丑陋的方法是将一个字符串作为成员变量添加到 Creature class 中,称为 flag。所以你可以使用字符串比较而不是实例比较,这是非常危险的。

if (oldCreature.flag.equals("SmallCreature"))
{
    newList.add(oldCreature); // another possible error: do you need a new copy or just reference?
}

你可以考虑用枚举class代替字符串,这也是一个可行且简单的解决方案。

public enum CreatureName{SmallCreature, LargeCreature}

再一次,如果你想将不同的行为应用到不同种类的subclass (dna),你有没有考虑过像策略或抽象class这样的设计模式?访客模式可能是 JB Nizet 提到的一个很好的模式。但这对于这个问题可能有点矫枉过正。