好吧,我有一个蜂巢模型,其中包含一个叫做细胞的蜜蜂的arraylist。我想要发生的是当蜜蜂健康命中0时它会从arraylist中移除(鸡蛋不需要吃)。每天蜜蜂的年龄增加1,如果有足够的食物,它就会被喂食,它的健康状况也会增加1(最多3个)。如果没有足够的食物,那么健康状况会减少1(当它从arraylist中移除时会达到0)。蜜蜂类是抽象的,并且具有诸如卵,幼虫,蛹等的子类。当蛋的年龄> 3它会变成幼虫,而幼虫则会在7岁时成为蛹。然而,我对编码这个问题存在严重问题。我已经设法得到喂养,健康增加/减少和去除,如果健康命中0罚款但我无法弄清楚如何将我的卵“进化”成幼虫。
我的代码:
public class Hive {
ArrayList<Bee> cells = new ArrayList<Bee>();
//some code omitted
public void anotherDay(){
for(int i = 0;i<cells.size(); i++){
System.out.println(cells.get(i));
Bee bee = cells.get(i);
try{
bee = bee.anotherDay();
}catch(Exception e){
cells.remove(i);
}
}
女王班:
public class Queen extends Bee{
//some code omitted
public Bee anotherDay() throws Exception{
eat();
age++;
if(age%3 == 2){
hive.addBee(new Egg());
}
return this;
}
public boolean eat() throws Exception{
if(hive.honey >= 2){
hive.takeHoney(2);
if(health < 3){
health++;
}return true;
}
health -= 1;
if(health == 0){
throw new Exception();
}
return false;
}
蛋类(幼虫和蛹中的方法相似):
public class Egg extends Bee {
//some code omitted
public Bee anotherDay(){
age = age++;
if (age>3){
return new Larvae();
}else{
return this;
}
}
答案 0 :(得分:2)
由于你的策略似乎是返回一个Bee对象,你可以用返回的值“替换”列表元素。
但我还有其他一些事情。首先,您使用Exceptions来执行程序逻辑。不要这样做。特别是因为你只是抛出一个空白的例外,通过这样做你也吃掉了所有其他例外。
第二个是你在迭代它时修改列表。这通常是一个坏主意,在某些情况下甚至可以throw a ConcurrentModificationException。
当你的女王放下一个鸡蛋时,这个名单会增加1个。由于您的循环基于列表大小,因此新的鸡蛋将包含在迭代中。这意味着您的鸡蛋会在1日龄时自动开始,而不是0天。去除死蜂也是一样的。在迭代时删除它们意味着你跳过下一个蜜蜂。
我不确定你的一些逻辑是什么意思,比如Queen#eat
中的内容,但这是试图展示更稳定的版本:
public class Hive {
ArrayList<Bee> cells = new ArrayList<Bee>();
public void anotherDay() {
List<Bee> dead = new ArrayList<Bee>();
int size = cells.size();
for(int i = 0; i < size; i++) {
Bee bee = cells.get(i);
System.out.println(bee);
// return null if the bee is dead
if ((bee = bee.anotherDay()) == null) {
dead.add(cells.get(i));
} else {
cells.set(i, bee);
}
}
cells.removeAll(dead);
}
}
public class Queen extends Bee {
public Bee anotherDay() {
eat();
if (health == 0) {
return null;
}
age++;
if (age % 3 == 2) {
hive.addBee(new Egg());
}
return this;
}
public boolean eat() {
if(hive.honey >= 2) {
hive.takeHoney(2);
if(health < 3){
health++;
}
return true;
}
health -= 1;
return false;
}
}
您不必返回null,这只是一个明显的选择。你也可以有isDead()
的标志:
class SomeBee extends Bee {
boolean isDead() {
return health <= 0;
}
Bee anotherDay() {
eat();
return this;
}
}
for (/* i...size */) {
Bee bee = cells.get(i);
if ((bee = bee.anotherDay()).isDead()) {
dead.add(bee);
}
cells.set(i, bee);
}
或类似以下内容:
abstract class Bee {
static final Bee DEAD_BEE = new Bee() {
@Override
Bee anotherDay() {
return this;
}
};
}
class SomeBee extends Bee {
@Override
Bee anotherDay() {
if (/* is dead */) {
return Bee.DEAD_BEE;
} else {
...
class Hive {
void anotherDay() {
...
for (/* */) {
Bee next = bee.anotherDay();
if (next == Bee.DEAD_BEE) {
/* it's dead */
} else {
...
由于增量错误,你的鸡蛋没有变老:
age = age++;
后缀增量计算为递增前的值。所以这基本上就像说age = age;
。增量无处可去。在这种情况下,只需删除赋值,它是多余的:
age++;
还有一个前缀增量(++age
),它会计算增量后的值。有时你确实希望增加/减少一个变量并立即使用它,因此这是一个重要的区别。
例如,您可以通过这种方式遍历数组:
int i = 0;
while (i < array.length)
System.out.println(array[i++]);
后缀和前缀增量可以定义为如下方法:
class Primitive_int {
int val;
// "++value"
int prefixIncrement() {
val = val + 1;
return val;
}
// "value++"
int postfixIncrement() {
int old = val;
val = val + 1;
return old;
}
}
答案 1 :(得分:0)
public class Hive {
ArrayList<Bee> cells = new ArrayList<Bee>();
//some code omitted
public void anotherDay(){
for(int i = 0;i<cells.size(); i++){
System.out.println(cells.get(i));
Bee bee = cells.get(i); // bee --> egg
try{
bee = bee.anotherDay(); // now bee --> Larve
cells.set(i,bee); // don't forget to set larve where bee was!
}catch(Exception e){
cells.remove(i);
}
}