0

我需要存储 n 行和 m 列的座位列表(代表教练/飞机等)。我还需要将座位分配给对象的能力。

我在想,如果我可以使用某种形式的数据结构,例如作为键的元组,那么地图可能是完美的。

例如

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

其中 (0,0) 将标识座位的行和列。然后 null 将标识一个座位没有被占用。

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

任何人都可以就存储这些数据集合的最佳方法提出建议吗?

谢谢

4

3 回答 3

0

如果nm是已知的,为什么不使用数组来代替呢?

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

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

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

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

于 2013-03-12T10:41:33.053 回答
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!
}
于 2013-03-12T10:42:20.170 回答
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];

如果数据的大小未知,您可以使用Lists 而不是数组:

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如果没有 row ,此 get 方法将抛出 a 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现在外部会自动创建内部映射,所以不会出现错误。这种结构更适用于稀疏数据。

如果您允许查看 3rd 方库,google guava 有您需要的确切内容,Table它本质上是最终数据结构的包装器。

另一种选择是使用 aMap<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));
于 2013-03-12T11:02:52.203 回答