1

我有以下实体关系的数据结构:

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

实体关系:

  • 1 Package( P ) 有很多Variants( V )
  • 1 Variants( V ) 有许多Price数据点
  • Price基于PAXType(这是一个枚举:成人、儿童、婴儿)

我使用以下方法对此进行了建模:

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

出于快速查找价格的目的

  • 包裹
  • 包装变体

我现在使用的方式是:当我从数据库读取数据时,我创建/更新上面的地图。在获得所有信息后,对于每个变体,我需要将价格图从Map<PAXType, BigDecimal>转换为Map<OccupancyType, BigDecimal>,其中 OccupancyType 是另一个枚举。这是我需要为序列化等输出的最终价格格式。

番石榴中是否有任何数据结构非常适合我拥有的丑陋地图结构并支持我上面建议的操作?

4

2 回答 2

8

除了 Tomasz 的回答建议Map<PAXType, BigDecimal>在类中封装PriceByType(请注意,如果PAXType是枚举,则应使用 EnumMap),我认为您应该考虑使用Guava 的 Table作为Map<Integer, Map<Integer, PriceByType>>. 表用例:

通常,当您尝试一次索引多个键时,您会得到类似 的东西Map<FirstName, Map<LastName, Person>>,这很难看且难以使用。Guava 提供了一种新的集合类型 Table,它支持任何“行”类型和“列”类型的这种用例。

您的索引是包和包变体,都是整数,所以表应该以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 回答