1

エンティティ関係の次のデータ構造があります。

Map<Integer, Map<Integer, Map<PAXType, BigDecimal>>>

エンティティ関係:

  • 1 Package( P ) には多くのVariants( V )があります
  • 1 Variants( V ) には多くのPriceデータポイントがあります
  • Priceに基づいていますPAXType(列挙型: Adult、Child、Infant)

私はこれを使用してモデル化しました:

Map<Package, Map<Variant, Map<PAXType, BigDecimal>>>

に基づく迅速な価格検索の目的で

  • パッケージ
  • パッケージバリアント

私が現在これを使用している方法は次のとおりです。データベースからデータを読み取るときに、上記のマップを作成/更新します。バリアントごとにすべての情報を取得したら、価格マップを から に変換する必要がありMap<PAXType, BigDecimal>ますMap<OccupancyType, BigDecimal>。ここで、OccupancyType は別の列挙型です。これは、シリアル化などのために出力する必要がある最終的な価格形式です。

私が持っていて、上で提案した操作をサポートする醜いマップ構造に適したデータ構造がグアバにありますか?

4

2 に答える 2

8

Map<PAXType, BigDecimal>クラスにカプセル化することを提案するTomaszの回答に加えてPriceByType(列挙型の場合はEnumMapを使用する必要があることに注意してください) 、代わりにGuava's TablePAXTypeを使用することを検討する必要があると思います。テーブルの使用例:Map<Integer, Map<Integer, PriceByType>>

通常、一度に複数のキーにインデックスを付けようとすると、 のようなものになってしまいMap<FirstName, Map<LastName, Person>>ます。これは見苦しく使いにくいものです。Guava は、新しいコレクション タイプ テーブルを提供します。これは、任意の「行」タイプおよび「列」タイプのこのユース ケースをサポートします。

インデックスはパッケージとパッケージバリアントであり、どちらも整数であるため、テーブルはTable<Integer, Integer, PriceByType>.

于 2012-06-28T08:39:05.447 に答える
3

Guava はここでは何もしません。意味のある名前を持ついくつかのオブジェクトを作成する必要があります。最初に、このマップを保持するクラスなどにカプセル化Map<PAXType, BigDecimal>します。PriceByType

Map<Integer, Map<Integer, PriceByType>>

Map<Integer, PriceByType>同じ方法で次に進みます。

Map<Integer, PriceByVariant>

最終的なマップを呼び出すことができますpriceByPackage。次に、これらのクラスを効果的にクエリするヘルパー メソッドをいくつか作成します。

public class PriceByType {

    private final Map<PAXType, BigDecimal> byType = //...

    public BigDecimal find(PAXType type) {
        return byType.get(type);
    }

}

と:

public class PriceByVariant {

    private final Map<Integer, PriceByType> byVariant = //...

    public BigDecimal find(int variant, PAXType type) {
        //handle unknown values here
        return byVariant.get(variant).find(type);
    }

}
于 2012-06-28T07:22:38.447 に答える