Java数据结构选择

时间:2018-08-27 19:40:44

标签: java arraylist

长话短说,我希望能够使用某种数据结构,该结构可以基于对象的x和y坐标检索值,尽管该值(空间)可以容纳多个对象。想一想带有可包含多个对象的图块的2d地图。我最初以为创建一个存储数组列表的2d数组,但是显然Java不允许这样做。我还希望能够基于预定义的x和y边界迭代结构的每个元素。我应该从这里去哪里?

编辑:是否会创建一个具有arraylist变量的新对象并将该对象存储在2d数组中?

3 个答案:

答案 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数组,但是它将有多个限制:它将整数用作索引,这可能会限制您的要求:xy没有浮点数,最大索引为2147483647,还有其他一些。
您可以定义以下内容:

MyObjects[][] myObjects = new MyObjects[50][200];

作为替代,您可以使用结构Map<XYCoord, List<MyObject>>,其中XYCoord是定义坐标的自定义类:xy并覆盖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));