の 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 Table
guava にはまさに必要なものがあり、これは本質的に最終的なデータ構造のラッパーです。
もう 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));