【问题标题】:Java ArrayList subclass extractionJava ArrayList 子类提取
【发布时间】:2018-01-23 16:17:46
【问题描述】:

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

我的问题是:我怎样才能制作另一个 ArrayList 或类似的东西,我可以在其中迭代 arraylist 并提取特定的子类?我看了看,由于 java Collections 的工作方式,我似乎没有办法这样做。是否有任何解决方法或某些库可以让我做到这一点?

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

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

//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));
    }
}

【问题讨论】:

  • 你试过了,但是你……什么?使该代码成为可编译的真正 Java 代码,您将得到答案(访问者模式会更简洁,但您可以从它开始)
  • ...遍历数组列表并提取特定的子类... - 你为什么要这样做?我问是因为这通常表明存在设计错误。您应该能够为对象本身添加足够的功能,这样您就不需要这样做了。
  • 我的生物有一种根据权重计算转向向量的方法。我将我希望计算其力的所有生物都传递给该方法。拥有单独的列表意味着我可以更重视对某一类生物产生的力量,而不是另一类生物产生的力量。 @OldCurmudgeon
  • 我试过这个,但我得到了所有生物的列表,因为它们都是 Creature 类:不,你没有尝试这个,因为这段代码无法编译.发布您实际尝试过的内容。
  • @JamesKarran 也许你可以在你的某个类的生物中改变你的计算转向向量方法,这样它就可以让它们对生成的力更加重要.

标签: java list arraylist collections simulation


【解决方案1】:

完全同意 OldCurmudgeon 的观点。您不应该提取子类。

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

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

您可以考虑使用枚举类而不是字符串,这也是一种可行且简单的解决方案。

public enum CreatureName{SmallCreature, LargeCreature}

如果您想将不同的行为应用到不同种类的子类 (dna) 上,您是否考虑过策略或抽象类等设计模式?访问者模式可能是 JB Nizet 提到的一个很好的模式。但这个问题可能有点过头了。

【讨论】:

  • 好的,我想我会尝试改变我的生物方法以接受整个列表,然后弄清楚该怎么做:)。感谢您的帮助
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2015-07-23
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2012-05-15
相关资源
最近更新 更多