Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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 存储具有x和y坐标的对象网格以描述其位置。阵列是可接受的解决方案吗?_Java_Android_Arrays_Grid - Fatal编程技术网

Java 存储具有x和y坐标的对象网格以描述其位置。阵列是可接受的解决方案吗?

Java 存储具有x和y坐标的对象网格以描述其位置。阵列是可接受的解决方案吗?,java,android,arrays,grid,Java,Android,Arrays,Grid,我正在Android上开发一个游戏,其中包含一个网格对象。现在我使用数组来存储对象,如下所示: public class ObjectBuffer { private final Object[] buffer; private final int playfieldWidth; ObjectBuffer(int playfieldWidth, int playfieldHeight) { super(); this.buffer = new Object[pl

我正在Android上开发一个游戏,其中包含一个网格对象。现在我使用数组来存储对象,如下所示:

public class ObjectBuffer {

  private final Object[] buffer;

  private final int playfieldWidth;

  ObjectBuffer(int playfieldWidth, int playfieldHeight) {
    super();
    this.buffer = new Object[playfieldWidth + (playfieldHeight * playfieldWidth)];
    this.playfieldWidth = playfieldWidth;
  }

  public static int getX(int id) {
    return id % playfieldWidth();
  }

  public static int getY(int id) {
    return id / playfieldWidth();
  }

  public Object get(int id) {
    return this.buffer[id];
  }

  public Object get(int x, int y) {
    return this.buffer[x + (y * this.playfieldWidth)];
  }
}
但是,我的问题是,这是实现这一目标的最佳方式吗?我选择了数组(而不是列表、ArrayList或其他容器),因为一旦设置了游戏场的宽度和高度,它们就不会改变。对象在那里表示状态,一旦它们被实例化并添加到数组中,它们可能会被更新,但不会被重新排列

我的问题类似于,但差异很大,所以我想单独提问。我的要求与他的不同,我认为在这种情况下不需要空间索引。如果我错了,请纠正我


我还应该提到,阵列的尺寸通常为10x10(100个元素),但可能需要能够适应适度的增加;但不需要处理超过15x15的网格(225个元素)。生成网格时,这些尺寸始终是已知的。生成网格后,维度不会更改。

多维数组是更好的解决方案:

Object[][] playfield = new Object[w][h];

这提供了更可读的代码,因为您可以将元素称为
playfield[x][y]
,而不是
playfield[x+y*WIDTH]
。如果您想使用集合,另一个选项是Google Guava中的
类。

更好的选项是创建类点

    class Point
    {
    int x;
    int y;

    //getter and setter methods for x and y

public void setCoordinates(int x, int y)
{
this.x=x;
this.y=y;
}

    }
然后创建一个点对象数组

Point[] mypoints
当您要设置mypoint[i]的坐标时

mypoint[i].setCoordinates(30,40)

集合不仅仅是支持动态大小的数据结构,它们还用于定义数据结构行为。使用数组本身没有什么错误(在调用堆栈的某个点上,它无论如何都会是错误的),但是定义集合允许您灵活地调用方法来获取所需的内容,而不是引用数组坐标。这样,如果您需要更改坐标系的行为(例如,假设您想屏蔽来自其他玩家的网格引用的内容?),您就不必接触在数组中迭代的代码。

我愿意使用多维数组,但有什么更好的呢?对于一维数组,每个元素有一个数组对象和一个对象。对于多维数组,每个数组都有对象(因此10行10列表示11个数组对象),然后是进入元素的对象。这意味着要使用多维数组,我需要将对象的数量增加11%(对于10x10游戏场)。除了在xy地址和数组索引之间转换所涉及的数学问题外,我看不到任何其他好处。因此,一个10x10的游戏场需要10个额外的对象。除非你的游戏场地很大,否则10秒甚至100秒的额外物体都没什么大不了的。@user949300没错,有几个额外的物体也没什么大不了的。但是如果你不需要,为什么要创建它们呢?尤其是在手机或其他移动设备上,内存比计算机更有限,最好不要创建超出需要的对象。也就是说,从x和y坐标以及从索引中得到x和y坐标所涉及的数学是负数。然而,对于我来说,切换我的实现还不够大。是否还有其他原因需要切换?一旦阵列的形状发生变化(例如,第4行是特殊的脊椎抽头行,它变为11,而其他所有行都有10),您将后悔您的决定。:-)@user949300如果您将答案更改为多维数组是另一个解决方案(或类似解决方案)而不是更好的解决方案,那么,我将选择它作为我问题的答案,因为这三个答案最接近。我存储的类具有x和y坐标以及索引,向用户显示该位置和其他状态信息的ImageView。谢谢你的建议。在你的游戏中,我猜网格中的每个点都可以容纳一个物体,比如子弹、战舰、精灵或者其他什么东西。他们两个能在同一点上吗?如果是这样,您可能需要在网格上的每个点上使用某种集合。网格中的每个位置都将包含一个气泡,每个气泡可以是不同的颜色,或者具有其他属性。气泡不会重叠,当点击时,气泡或其周围的其他气泡将“弹出”并消失,然后上面的气泡将下降以取代其位置。我不知道如何通过集合来满足我的需求,从而实现ObjectBuffer类的性能和简单性。我需要定义一个键。我能想到的最好的方法就是我现在使用的索引。要在特定位置检索对象,我需要在集合中搜索正确的键(否则集合会)。即使使用散列,该过程似乎也比指向引用(数组中元素的索引)慢得多。在某种程度上,我的ObjectBuffer类是一种集合类型,而不是Java中包含的集合类型。(待续)(续自上次评论)请帮助我了解如何实施您所描述的内容。如果需要,我可以提供我的实现的更多细节。