2017-07-16 50 views
0

我正在从事电子商务产品。这个电子商务在很多地方都有许多网上商店。对于每个类别,它在不同的商店中都有不同的ID。现在的问题是我们想要在同类产品的商店之间映射类别。类别映射的高效数据结构

我们必须存储在数据库中的JSON其中包含了国家测绘:

[ 
    { 
    "sg": 4, 
    "jp": 128, 
    "ph": 4, 
    "hk": 4, 
    "th": null 
    }, 
    ... 
] 

因此,这意味着在新加坡类别ID 4是在日本128。我们实际上是 使用这样的结构来映射跨国家的类别。

我有这样的接口来实现这一目标:

public interface CategoryMapper { 
    int getCategory(String sourceCountry, String destinationCountry, int categoryId); 
} 

我想优化的阅读速度。我应该如何实现这个目标?

我有以下

  1. 2个选项使用Java的哈希表来存储键/值
  2. 使用高速缓存架构和存储为键/值

感谢

+0

使用,如果你需要限制大小或做驱逐的高速缓存。没有其中之一的缓存仅仅是一张地图。 –

+0

JSON看起来有问题。你如何区分一套和另一套? –

回答

1

解决此问题的一种方法是创建一个如下所示的双向映射,因为我们不存储对象,因为小字符串是不可变的,例如,单词“Electronic”是只在内存中存储一​​次。

Try Online

class ProductCategoryMap 
{ 
    Map<String,Set<String>> prodMap; 
    Map<String,String> codeMap; 
    Map<String,Integer> catMap; 

    public ProductCategoryMap() 
    { 
     prodMap = new HashMap<>(); 
     codeMap = new HashMap<>(); 
     catMap = new HashMap<>(); 
    } 

    public void put(String category, String region, int code) 
    { 
     if(!prodMap.containsKey(category)) 
     { 
      prodMap.put(category, new TreeSet<>()); 
     } 
     prodMap.get(category).add(region); 

     catMap.put(category+region, code); 
     codeMap.put(region+code, category); 
    } 

    public String getCategory(String country, int catId) 
    { 
     return codeMap.get(country+catId); 
    } 

    public int getCategoryId(String category, String country) 
    { 
     return catMap.get(category+country); 
    } 

    public int getDestCatId(String srcCountry, String destCountry, int srcCatId) 
    { 
     String category = getCategory(srcCountry, srcCatId); 
     return getCategoryId(category, destCountry); 
    } 

    public TreeSet<String> getAvailability(String category) 
    { 
     return prodMap.get(category); 
    } 
} 
0

你可以使用HashMap的HashMap来做到这一点如下:

Map<String, Map<String, Integer>> map = new HashMap<String, Map<String, Integer>>(); 

当第一个键(外部地图的键)是类别名称(例如,电子)和第二个键(内部地图的关键)是位置名称。 通过这种方式,您可以高效地获取带有2个HashMap访问的任何标识。 如this SO post中所述,您可以使用LinkedHashMap来限制您的HashMap大小,使其成为LRU(或任何其他策略)缓存。 除此之外,您可以使用EHCache或OSCache之类的Java缓存框架。

+0

不编译。 – shmosel