您可以使用PersonObject
二维数组来做到这一点,用法是:
final PersonObject[][] seats = new PersonObject[x][y];
//set a person
seats[a][b] = myPerson
//get a person
final PersonObject myPerson = seats[a][b];
如果数据的大小是未知的,你可以使用List
做得相当比列:
final List<List<PersonObject>> seats = new ArrayList<List<PersonObject>>();
//set a person
List<PersonObject> list = seats.get(a);
if(list == null) {
list = new ArrayList<PersonObject>();
seats.add(a, list);
}
list.add(b, myPerson);
//get a person
final PersonObject myPerson = seats.get(a).get(b);
请注意,第二种方法更容易出错,因为您需要将人员放入行中,否则seats.add(a, list)
将导致错误。如果人员没有按顺序排列,则list.add(b, myPerson)
将导致错误。
要解决这个问题,你可以使用贵方提出的数据结构,这看起来像
final Map<Integer, Map<Integer, PersonObject>> seats = new HashMap<Integer, Map<Integer, PersonObject>>();
//set a person
Map<Integer, PersonObject> map = seats.get(a);
if(map == null) {
map = new HashMap<Integer, PersonObject>();
seats.put(a, map);
}
map.put(b, myPerson);
//get a person
myPerson.get(a).get(b);
这get方法将抛出一个NullPointerException
如果没有行a
。这可以通过扩展HashMap
并重写put
方法避免:
final Map<Integer, Map<Integer, PersonObject>> seats = new HashMap<Integer, Map<Integer, PersonObject>>(){
@Override
public Map<Integer, PersonObject> get(Object key) {
Map<Integer, PersonObject> map = super.get(key);
if(map == null) {
map = new HashMap<Integer, PersonObject>();
put((Integer)key, map);
}
return map;
}
};
//set a person
map.seats.get(a).put(b, myPerson);
//get a person
myPerson.get(a).get(b);
由于外Map
现在autocreates内的地图就没有误差。这种结构对于稀疏数据效果更好。
如果你允许查看第三方库,谷歌番石榴有确切的事情,你需要一个Table
它本质上是一个包装最终的数据结构。
另一种替代方法是使用Map<Point, PersonObject>
,因为Point
类已经存在an代表二维空间中的一个点。
final Map<Point, PersonObject> seats = new HashMap<Point, PersonObject>();
//set a person
seats.put(new Point(a,b), myPerson);
//get a person
myPerson = seats.get(new Point(a,b));
我想象一下'PersonObject [] []'是最简单的。将它包装在某种控制器类中,这样您就不必担心代码中其他任何地方的结构。 – 2013-03-12 10:41:15