0

n 行 m 列の座席 (コーチ/飛行機などを表す) のリストを保存する必要があります。オブジェクトに座席を割り当てる機能も必要です。

キーにタプルに似た何らかの形式のデータ構造を使用できれば、マップはこれに最適であると考えていました。

例えば

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

(0,0) は座席の行と列を示します。null は、座席が使用されていないことを示します。

しかし、私が見たマップは通常文字列をキーとして使用しているため、この方法が可能かどうかはわかりません。また、問題に対して多次元配列とリストを使用することも検討しました。

このデータのコレクションを保存するための最良の方法について誰かアドバイスできますか?

ありがとう

4

3 に答える 3

0

nとがわかっている場合mは、代わりに配列を使用してみませんか?

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

あなたが説明するデータ構造は可能です。それはそのようになります

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

しかし、必要のない大量のメモリ オーバーヘッドが発生し、処理があまり便利ではないため、ニーズに合わないようです。

于 2013-03-12T10:41:33.053 に答える
0

の 2 次元配列を使用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、配列ではなく sを使用できます。

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

2 番目のアプローチは、人を順番に行に配置する必要があるため、エラーが発生しやすいことに注意してください。そうしない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 Tableguava にはまさに必要なものがあり、これは本質的に最終的なデータ構造のラッパーです。

もう 1 つの方法は、2 次元空間内の点を表すクラスが既に存在するため、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 に答える
0

単純に 2 次元配列を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 に答える