更改arraylist中对象的类

时间:2013-12-07 20:49:26

标签: java class exception arraylist

好吧,我有一个蜂巢模型,其中包含一个叫做细胞的蜜蜂的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;
    }

}

2 个答案:

答案 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);
            }
    }