Java数据结构选择
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java数据结构选择相关的知识,希望对你有一定的参考价值。
长话短说我希望能够使用某种数据结构,它可以根据对象的x和y坐标检索值,尽管该值(空间)可以容纳多个对象。想想带有可包含多个对象的切片的二维地图。我最初想创建一个存储arraylists的二维数组,但显然Java不允许这样做。我还希望能够根据预定义的x和y边界迭代结构的每个元素。我应该从哪里出发?
编辑:会创建一个带有arraylist变量的新对象,并将该对象存储在2d数组中是一个合理的解决方法吗?
答案
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));
另一答案
也许使用带有Point对象的Map作为键,将ArrayList作为值?
另一答案
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)
以上是关于Java数据结构选择的主要内容,如果未能解决你的问题,请参考以下文章
从图库中选择照片(onActivityResult()问题 - 我想是这样) - 片段Android