Java数据结构选择

问题描述 投票:0回答:3

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

编辑:会创建一个带有arraylist变量的新对象,并将该对象存储在2d数组中是一个合理的解决方法吗?

java arraylist
3个回答
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));

1
投票

也许使用带有Point对象的Map作为键,将ArrayList作为值?


0
投票

Java允许您创建一个二维ArrayLists数组,如下所示:

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)
© www.soinside.com 2019 - 2024. All rights reserved.