【发布时间】:2016-05-17 08:36:58
【问题描述】:
我有一张地图。 Key 包含 6 个字符串,Properties 类大致如下所示:
public class Properties {
private String propertyOne;
private String propertyTwo;
private String propertyThree;
private String propertyFour;
...
...
}
现在假设我在地图中有一些条目如下:
41111 -> {1,2,3,4,5}
41112 -> {1,2,3,4,6}
41234 -> {1,2,345,87,65}
51123 -> {100,200,30000,345,123}
51122 -> {100,200,30000,556,989}
现在,如果我执行map.get("12567"),我会得到所需的属性对象。
我面临的挑战是,我必须创建一个可以保存部分数据的数据结构。通过部分数据,我的意思是如果我做map.get("4111") 我应该得到{1,2,3,4,5} (41111 的属性) 和{1,2,3,4,6} (41112 的属性)的交集 ) 即{1,2,3,4,null}.
同样map.get("41") 应该产生{1,2,null,null,null}。
我现在有一个解决方案,我创建了多个 HashMap,其中包含所有可能的部分键及其对应的值,例如:
Map<String, Property>`` keyValuesForOneChar 包含所有可能的单个字符作为键及其对应的值。
Map<String, Property> keyValuesForTwoChars 包含所有可能的两个字符作为键及其对应的值。
我不喜欢这个解决方案,因为它非常简单,而且我认为维护多个哈希图不是一个好主意。另一个问题是我的原始数据数量约为 200000,并且所有排列组合都会创建大量的部分数据,并且由于数量庞大,我认为哈希图的性能会降低。请为这个问题提出一个更好的解决方案。我有以下限制:
- 严格来说,解决方案只能是内存中的。
- 查找应该更快。这就是为什么如果处理原始数据和准备数据结构需要额外的时间和内存,这应该不是问题。
【问题讨论】:
-
对于@T。 Clarverie 回答如果需要找到“11”作为键,然后应该与 41111、41112、51123 和 51122 相交,或者搜索总是从键的开头开始,这会很有趣?
-
它应该总是从头开始。
标签: java data-structures hashmap in-memory