Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保留常规ArrayList中单个子类的所有实例_Java - Fatal编程技术网

Java 如何保留常规ArrayList中单个子类的所有实例

Java 如何保留常规ArrayList中单个子类的所有实例,java,Java,我遇到了一个问题,我想不出一个干净的解决办法 我有一个超类“生物”和子类“人类”和“僵尸” 我构建了一系列人类和僵尸,并将它们保存在ArrayList中 现在我想得到只包含构建的人类的子阵列列表。 我想我可以用“Retainal”,但结果它并没有达到我想的效果 如何创建一个新的ArrayList,其中只包含Zombie子类的对象,有什么建议吗?您需要通过元素进行迭代,使用instanceof并构建一个新的ArrayList。为此,我将使用Google Guava库查看操作符instanceof

我遇到了一个问题,我想不出一个干净的解决办法

我有一个超类“生物”和子类“人类”和“僵尸” 我构建了一系列人类和僵尸,并将它们保存在ArrayList中 现在我想得到只包含构建的人类的子阵列列表。 我想我可以用“Retainal”,但结果它并没有达到我想的效果


如何创建一个新的ArrayList,其中只包含Zombie子类的对象,有什么建议吗?

您需要通过元素进行迭代,使用instanceof并构建一个新的ArrayList。为此,我将使用Google Guava库

查看操作符
instanceof


注意:如果您需要根据特定实例类型筛选列表-如果您提供有关您尝试执行的操作的更多详细信息-可能有更好的方法来实现它,并且您的代码可以使用
instanceof
操作符。请尝试以下代码:

List<Human> humans = new ArrayList<Human>();
for (Creature creature : creatures) {
    if (creature instanceof Human) {
        humans.add((Human) creature);
    }
}
List humans=new ArrayList();
用于(生物:生物){
if(人类的生物实例){
人类。添加((人类)生物);
}
}

我不认为有一种非常干净的方法可以做到这一点,只使用其他答案中提到的instanceof和Cast

如果可能的话,我建议保留每种类型的单独列表,并且仅当您需要所有生物时才合并列表。

列出僵尸=
Lists.newArrayList(Iterables.filter(biods,Zombie.class));

谢谢,我一直在寻找实例,但似乎更好的方法可能是保留单独的列表。问题是,在程序中的某个地方,我需要从所有列表中随机选择一个人,所以如果我保持单独的列表,它会有偏差:/@user1193435有办法处理这个问题。例如,维护两个列表:一个用于僵尸,另一个用于人类。当你想要选择一个随机生物时,选择一个概率为
humans.size()/(zombies.size()+humans.size())
的人。如果你想了解更多细节-这是另一回事,你可能想问一个关于它的新问题。你指的是一个p[human]=[h.size/h.size+z.size]成功=1->接受人为失败=0->接受失败zombie@user1193435当前位置是的,类似这样,当选择一个随机的人时,你选择他的概率
P(h)=1/h(h.size/(h.size+z.size))=1/(h.size+z.size)
,每个僵尸都是一样的-所以你可以得到无偏的随机选择。虽然它更复杂,但应该在一个新问题中进行讨论。@user:一个更简单/更容易理解的方法可能是简单地生成一个随机索引
index=random.nextInt(humans.size()+zombies.size())
然后像这样选择
生物随机生物=索引>=humans.size()?zombies.get(index humans.size()):humans.get(index);
换句话说,将两个列表视为一个大列表,选择一个随机索引,然后计算出实际子列表的索引。
List<Zombie> zombies = 
    Lists.newArrayList(Iterables.filter(creatures, Zombie.class));