我有实体关系的以下数据结构:
Map<Integer, Map<Integer, Map<PAXType, BigDecimal>>>
实体关系:
Package
( P )有多个Variants
( V )Variants
( V )有多个Price
个数据点Price
基于PAXType
(枚举:成人,儿童,婴儿)我使用以下方式对此进行了建模:
Map<Package, Map<Variant, Map<PAXType, BigDecimal>>>
基于
进行快速价格查询我现在使用它的方式是:
当我从数据库中读取数据时,我创建/更新上面的地图。收到所有信息后,对于每个变体,我需要转换价格图,从Map<PAXType, BigDecimal>
转换为Map<OccupancyType, BigDecimal>
,其中OccupancyType是另一个枚举。这是我需要为序列化等输出的最终价格格式。
番石榴中是否有任何数据结构适合我所拥有的丑陋的地图构造并支持我上面建议的操作?
答案 0 :(得分:8)
除了Tomasz的回答建议在Map<PAXType, BigDecimal>
类中封装PriceByType
(请注意,如果PAXType
是枚举,则应使用EnumMap)我认为您应该考虑使用{{3} }替换为Map<Integer, Map<Integer, PriceByType>>
。表用例:
通常,当您尝试在a处索引多个键时 时间,你会发现像
Map<FirstName, Map<LastName, Person>>
这样的东西,它很丑陋,难以使用。番石榴 提供了一个新的集合类型Table,它支持这个用例 对于任何“行”类型和“列”类型。
您的索引是包和包变体,都是整数,因此表最终应为Table<Integer, Integer, PriceByType>
。
答案 1 :(得分:3)
Guava在这里无关,你需要创建一些具有有意义名称的对象。首先将Map<PAXType, BigDecimal>
封装到例如{1}中。持有此地图的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);
}
}