长话短说,我希望能够使用某种数据结构,该结构可以基于对象的x和y坐标检索值,尽管该值(空间)可以容纳多个对象。想一想带有可包含多个对象的图块的2d地图。我最初以为创建一个存储数组列表的2d数组,但是显然Java不允许这样做。我还希望能够基于预定义的x和y边界迭代结构的每个元素。我应该从这里去哪里?
编辑:是否会创建一个具有arraylist变量的新对象并将该对象存储在2d数组中?
答案 0 :(得分:1)
也许使用Map和Point对象作为X和Y坐标作为键,并使用ArrayList作为值?
答案 1 :(得分:0)
Java确实允许您像这样创建ArrayList的二维数组:
ArrayList<ArrayList<String>> mainArrayList = new ArrayList<>();
然后,您可以根据需要简单地添加行:
for (i=0; i<10; i++){
mainArrayList.add(new ArrayList<String>());
}
然后,您可以像这样使用x,y坐标:
// Returns the ArrayList being stored at coordinate x, y.
objectsAtCoordinate = mainArrayList.get(x).get(y)
答案 2 :(得分:0)
Java允许这样定义2d数组,但是它将有多个限制:它将整数用作索引,这可能会限制您的要求:x
和y
没有浮点数,最大索引为2147483647
,还有其他一些。
您可以定义以下内容:
MyObjects[][] myObjects = new MyObjects[50][200];
作为替代,您可以使用结构Map<XYCoord, List<MyObject>>
,其中XYCoord
是定义坐标的自定义类:x
和y
并覆盖equals()
和hashCode()
依靠这两个字段,例如:
public class XYCoord {
private int x;
private int y;
public XYCoord(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof XYCoord))
return false;
XYCoord other = (XYCoord) obj;
if (x == other.x && y == other.y)
return true;
return false;
}
}
您可以这样使用它:
// create the map
Map<XYCoord, List<MyObject>> objectsOnThePlan = new HashMap<>();
// populate it
objectsOnThePlan.put(new XYCoord(1O, 30), new ArrayList<>(Arrays.asList(fooObj, fooObj2, fooObj3)));
objectsOnThePlan.put(new XYCoord(40, 20), new ArrayList<>(Arrays.asList(barObj, barObj2, barObj3)));
// retrieve List from a specific coordinate
List<MyObject> listFrom10x30y = objectsOnThePlan.get(new XYCoord(10, 30));