使用哪种数据结构(在JAVA中)和3组随机顺序的键
我有3组键:一组是type,另一组是subtype,最后一组是ID,value是ProductObj。最初,我考虑将ProductObj存储在HashMap的HashMap中(使用哪种数据结构(在JAVA中)和3组随机顺序的键,java,data-structures,Java,Data Structures,我有3组键:一组是type,另一组是subtype,最后一组是ID,value是ProductObj。最初,我考虑将ProductObj存储在HashMap的HashMap中(HashMap),以加快搜索速度(希望将其设计为缓存,而不是一直从数据库中检索)。[注意:#of productObj是固定的]但是,我了解到,50%的时间里,我可能只获取ID,而不获取类型/子类型,另外50%将获取类型/子类型,但不获取ID。什么样的数据结构适合这种用途 我想到了HashMap和另一个HashMap,但我
HashMap
),以加快搜索速度(希望将其设计为缓存,而不是一直从数据库中检索)。[注意:#of productObj是固定的]但是,我了解到,50%的时间里,我可能只获取ID,而不获取类型/子类型,另外50%将获取类型/子类型,但不获取ID。什么样的数据结构适合这种用途
我想到了HashMap
和另一个HashMap
,但我希望在数据结构方面找到更好的解决方案。提前谢谢
[补充资料]
这就是希望存储的{type=1 subtype=1 id=1=prodObj1,type=1 subtype=1 id=2=prodObj2,…}
当给定id时:例如id=1,则返回prodObj1
当给定类型时:例如type=1,同时返回prodObj1和prodObj2
当给定类型和子类型时:例如,类型=1子类型=1,则同时返回prodObj1和prodObj2
当给定类型、子类型和id时:例如,类型=1子类型=1 id=1,则返回prodObj1
我希望利用类似HashMap的数据结构,基于键值进行更快的搜索,因为我将访问缓存并经常更改prodObj状态 为什么要使用嵌套贴图 如果不在映射中操作大量值,可以使用定义复合键(类型、子类型和id)的自定义类作为键 这样,当您从中获取或放入时,可以将此复合键的一个实例传递给地图
public class ProductKey{
private Long id;
private string type;
private string subType;
private ProductKey(){
}
public static ProductKey ofWithId(Long id){
ProductKey productKey = new ProductKey();
productKey.id = id;
return productKey;
}
...
// other factory methods
...
// equals and hashcode overriden of course
}
您可以通过以下方式实例化和填充地图:
Map<ProductKey, ProductObj> map = new HashMap<>();
map.put(ProductKey.ofWithId(1), myProductObj);
map.put(ProductKey.ofWithTypeAndSubType("type", "subtype"), anotherProductObj);
...
ProductObj retrievedObj = map.get(ProductKey.ofWithId(1));
我建议使用单个HashMap。将贴图的键设置为三个值的组合 最简单的是使用分隔符的字符串,该分隔符不会在任何值中使用。例如,使用Java 8:
String key = String.join(":", type, subType, id) ;
productMap.put(key, product) ;
join方法是空安全的,因此如果缺少这些值就可以了。我建议使用字典。它可能也不是最有效的,但很容易使用。以下是文档:@Jsleshem为什么您认为这比
HashMap
s更好?特别是在文档中提到“注意:这个类已经过时了”的情况下。这3个键是复合键,因此每个组合只存在一次吗?子类型和ID是全局唯一的还是只有所有3个部分的组合唯一?如果它们是全局唯一的,您可以使用3个映射(它可能是映射
或更好的Guava的多映射
实现之一),然后您可以获得提供的键的值并返回这些结果集的交集。@Andy Turner我已经使用字典一段时间了。假设每个子类型都有多个产品,您需要使用集合作为映射值,也许是时候切换到HashMap了。@Thomas您完全正确。根据实际需要,使用集合作为值可能是合适的。但我认为总体思路仍然有效。是的,我同意单哈希映射更好。希望利用HashMap的键“索引”。谢谢@davidxxx我实际上需要填充产品密钥中的所有3个密钥,只是搜索不同。如果我存储一个ProductKey(比如:type=1、subtype=1和id=1->prodObj1),那么在搜索过程中只给出id=1,我如何找到prodObj1?这是我不清楚的部分,我没有用它作为关键。也许我误解了什么。你能给点建议吗?不客气。这取决于你的型号。值为1的id是否唯一?或者有其他id为1的产品,但有其他类型和子类型吗?我也更喜欢单一地图。