2017-11-23 25 views
-2

私は、すべての部門の店舗を保管し、キャッシュしたいアプリケーションを作成しています。国、州、市、郵便番号の階層構造に最適なデータ構造

階層は次のようになります: -

国 - >州 - >シティ - >エリア - >店舗私は自分のアプリケーションがあれば

    のように動作します使用する必要があるデータ構造

  1. 私は国と州を照会し、それは私にすべての店を与える必要があります
  2. 私は国と州と都市を照会し、それは私にその地域のすべての店を与える必要があります。

私はTreeを考えただけですが、このシナリオをこのデータ構造に変換することはできません。

+1

このスキーマに最適なツールはおそらくデータベースのようなものです。あなたは1つを使用していない理由は何ですか? –

+0

@TimBiegeleisenすべてのデータが1つのテーブルに格納されていますが、そのテーブルで一度クエリを実行し、キャッシュしてクエリを実行する必要があります。 –

+0

私は、正しいインデックスを追加し、純粋にJavaでこれを処理します。 –

答えて

1

キャッシュの情報を入力します。それは本当です、そしてあなたはそれを変更する必要はありませんが、のみキャッシュは、それは、私が木のアイデアを放棄し、単にあなたが本当に必要なキーの組み合わせ、すなわちに基づいて2つのマップを構築することをお勧めしたい場合:

  • タイプ1のキー(国と州で構成されている)をストアのリストにマッピングする1つのキャッシュ
  • エリア内のストアのリストにタイプ2のキー(国、州および都市からなる)をマッピングする1つのキャッシュ

これはキャッシュのポイントです。実際には、すべてのロジックを格納する必要があります(どのストアがキーのどの組み合わせに属しているか値)をキャッシュの構成(初期または最初の要求時)に挿入し、ルックアップを行うたびにあらゆる種類の繰り返しを開始しないようにします。

1

だから次のレベルダウンの地図含む各レベルで、階層を構築:

class Store { 
    string name; 
    // other stuff 
} 

class Area { 
    string name; 
    Map<string, Store> stores; 
    // other stuff; 
} 

class City { 
    string name; 
    Map<string, Area> areas; 
    // other stuff 
} 

class State { 
    string name; 
    Map<string, City> cities; 
    // other stuff 
} 

class Country { 
    string name; 
    Map<string, State> states; 
    // other stuff 
} 

をそして、あなたは、クラススコープで国のMapを持っている:

Map<string, Country> countries; 

したい場合特定の国、州、市のすべての店舗については、まず都市への参照を取得する必要があります。

Country country = countries[countryName]; 
State state = country.states[stateName]; 
City city = state.cities[cityName]; 

今、都市のエリアごとに、あなたは、各店舗にアクセスしてください。

for (Map.Entry<String, Area> pair : city.areas.entrySet()) 
{ 
    Area area = entry.getValue(); 
    for (Map.Entry<String, Store> storePair : areas.stores.entrySet()) 
    { 
     // Here, pair.getKey() is the store name 
     // and pair.getValue() is the Store object 
    } 
} 

これは本当に、ネストされた辞書を用いて実装だけ階層ツリーです。何もない。

関連する問題