使用随机顺序的3组密钥在JAVA中使用的数据结构

时间:2017-06-20 15:49:22

标签: java data-structures

我有3组密钥:一组是类型,另一组是子类型,最后一个是ID,值是ProductObj。最初,我想到将ProductObj存储在HashMap的HashMap的HashMap中(HashMap<type, HashMap<subtype, HashMap<ID, prodObj>>>)以便更快地搜索(想要将其设计为Cache而不是保持从DB中检索)。 [注意:productObj的#是固定的]但是,我了解到50%的时间,我可能只获得ID而不是类型/子类型,另外50%是类型/子类型但没有ID。什么是适合此目的的良好数据结构?

我想到了HashMap<type, HashMap<subtype, HashMap<ID, uuid>>>和另一个HashMap<uuid, prodObj>,但我希望在数据结构方面找到更好的解决方案。提前谢谢!

[补充资料]

这是希望存储{type = 1 subtype = 1 id = 1 = prodObj1,type = 1 subtype = 1 id = 2 = prodObj2,...}

当给出id时:例如id = 1,然后返回prodObj1

当给出类型时:例如type = 1,返回prodObj1和prodObj2

当输入&amp;给出了亚型:例如type = 1 subtype = 1,返回prodObj1和prodObj2

当类型,子类型和&amp; id给出:例如type = 1 subtype = 1 id = 1,然后返回prodObj1

我希望利用类似HashMap的数据结构,根据键值进行更快速的搜索,因为我将访问缓存并经常更改prodObj状态。

2 个答案:

答案 0 :(得分:2)

为什么要使用嵌套地图?

如果您没有操作地图中的大量值,则可以使用定义复合键(类型,子类型和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));

答案 1 :(得分:1)

我建议使用单个HashMap。使地图的键成为三个值的组合。

最简单的是使用不会在任何值中使用的分隔符的String。例如,使用Java 8:

GameScene

join方法是null安全的,所以如果缺少这些值就没问题。