在数据结构中分配席位

时间:2013-03-12 10:38:57

标签: java list data-structures map multidimensional-array

我需要存储n行和m列的座位列表(代表教练/飞机等)。我还需要能够将座位分配给一个物体。

我认为如果我可以使用某种形式的数据结构(例如类似于元组的元组),地图可能是完美的。

e.g。

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

其中(0,0)表示座位的行和列。然后null将识别出未占用座位。

但我不确定这种方法是否可行,因为我见过的地图通常使用String作为关键。我还考虑过使用多维数组和列表来解决这个问题。

有人可以建议存储此数据集的最佳方法吗?

由于

3 个答案:

答案 0 :(得分:0)

如果知道nm,为什么不使用数组?

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

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

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

但它似乎并不适合您的需求,因为它会引入您不需要的大量内存开销,并且处理起来也不是很方便。

答案 1 :(得分: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!
}

答案 2 :(得分: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);

如果没有行NullPointerException,此get方法将抛出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现在自动创建内部地图,所以不会有错误。对于稀疏数据,这种结构效果更好。

如果您允许查看第三方库,google guava会提供您需要的确切内容,Table本质上是最终数据结构的包装。

另一种选择是使用Map<Point, PersonObject>,因为Point类已经存在,表示二维空间中的一个点。

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));