Java:获取空值的数组位置

时间:2014-08-04 11:40:47

标签: java arrays list object null

所以...我试图在Java中创建的程序是一个模拟器,通过使用列表和2D数组来移动不同类型的生物。目前,在每个生物试图移动之前,它会搜索周围的瓦片以查看其中的内容,并根据其发现的内容做出不同的反应,例如:捕食者或食物生物。我的挑战是,如果它什么都找不到,我需要某种方式知道它周围的空元素/空格的数组索引位置,这样我就可以随机移动到其中一个空格。发布下面的一些代码,希望更有意义:

ArrayList <Fish> fishes; ArrayList <Penguin> penguins; ArrayList <Shark> sharks;

这些是创建时存储在arraylist中的不同类型的生物对象,每种类型都是Creature类的子/扩展。新生物在init方法中生成(连同初始化的列表和数组),然后在createNew方法中定义,每个生物类型都有。完成后,它会添加上述列表之一和其他2个位置:

ArrayList<Creature> crlist; Creature [][] gridloc;

crlist是模拟器中当前活着的所有生物的列表,gridloc是每个生物相对于彼此和屏幕的位置,并且是知道移动到哪里的最重要的生物。

当一个生物移动时,它使用移动方法,首先执行此操作:

List<Creature> moves = search();

并搜索这个......

public ArrayList<Creature> search() {

        int gx = getPos().width/txs; int gy = getPos().height/tys;
        search = new ArrayList();

        for (int sy=-1;sy<=1;sy++) {
           for (int sx=-1;sx<=1;sx++) {
               if (gridloc[gx+sx][gy+sy]!=this && gx+sx>=0 && gx+sx<=ntx && gy+sy>=0 && gy+sy<=nty) {
                   search.add(gridloc[gx+sx][gy+sy]);
               }
           }
        }

        return search;
    }

这只是搜索生物周围的所有数组索引/图块,同时忽略自身并确保它无法搜索超出窗口的边缘。然后在子方法中修改搜索结果,具体取决于生物类型(上面用super.search()调用),优先级取决于它在开始时描述的内容,因此如果找到捕食者,它将删除除搜索列表中的空值/空格外的所有内容,以便它可以尝试逃跑。

我的挑战是(经过长时间的啰嗦解释)在移动中它获得搜索列表的修改版本以确定生物可以移动到的位置。然而,由于空格包含空值,我无法想到一种方法来获取生物移动到的这些空间的位置/索引。 我唯一的想法就是当搜索找到一个空值来添加到列表中时,它可以创建一个新对象,它只保存move方法可以使用的坐标。只是希望有更好的方法......?

2 个答案:

答案 0 :(得分:0)

您可以创建NullCreature并将其用于所有空网格位置。如果你&#34; preload&#34;这些进入网格后,您的search()方法不需要创建它们(只需将它们添加到返回列表中)。

首选返回一个包装器对象,其中包含Creature列表(您当前的返回值)和空位置列表。这是更好的imo,因为你真正想做的是返回更多的信息,而不仅仅是附近的生物列表。

答案 1 :(得分:0)

返回包装器对象怎么样。

enum Type{
    Food, Null, Predator
}

class Wrapper{
    Creature c;
    int x,y;
    Type positionType;
}

public ArrayList<Wrapper> search(){}

您可能还search返回Multimap<Type, Wrapper>,这样您就可以快速检查相邻捕食者或食物,而无需重复列表。

Multimap