使用哪种数据结构(在JAVA中)和3组随机顺序的键

使用哪种数据结构(在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,但我

我有3组键:一组是type,另一组是subtype,最后一组是ID,value是ProductObj。最初,我考虑将ProductObj存储在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的产品,但有其他类型和子类型吗?我也更喜欢单一地图。