2013-03-12 34 views
0

我需要存储n行m列的座位列表(代表教练/飞机等)。我还需要能够将座位分配给对象。在数据结构中分配座位

我在想,如果我可以使用某种形式的数据结构,例如类似于Tuple的关键字,那么地图可能是完美的。

例如

map = { (0,0): null, 
     (0,1): Person1Object, 
     (0,2): Person2Object, 
     ... 
     (n,m): PersonNObject 
     } 

其中(0,0)将标识座位的行和列。然后,null将识别不被占用的座位。

但我不知道这种方法甚至可能作为我见过的地图通常使用字符串作为关键。我也考虑过使用多维数组和列表来解决这个问题。

任何人都可以建议存储此数据集合的最佳方法吗?

感谢

+0

我想象一下'PersonObject [] []'是最简单的。将它包装在某种控制器类中,这样您就不必担心代码中其他任何地方的结构。 – 2013-03-12 10:41:15

回答

0

您可以使用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)); 
0

如果nm是已知的,你为什么不使用,而不是一个数组?

PersonObject[][] seats = new PersonObject[n][m]; 

您所描述的数据结构是可能的。这将是

Map<Integer, Map<Integer, PersonObject>> seats = ... 

但它似乎并不满足您的需求,因为它会引入大量的内存开销,你并不需要,它也没有处理非常方便。

0

可以简单地使用的PersonObjects和使用索引的二维阵列作为行和列数目的指示

例如:

PersonObject seatMatrix = new PersonObject[100][100]; 

,以指示该行0,列1被取(占用)做这样的:

seatMatrix[0][1] = new PersonObject(); 

要检查是否有特定的(例如:第1行1列)席取,你可以这样做:

if(seatMatrix[1][1] != null) 
{ 
    //this seat is taken 
} 
else 
{ 
    // this seat is not taken! 
}