用于类别映射的高效数据结构

时间:2017-07-16 02:28:25

标签: java data-structures

我正在使用电子商务产品。这个电子商务在许多地方都有许多在线商店。对于每个类别,它在不同的商店中具有不同的ID。问题是现在我们想要在同一类产品的商店之间映射类别。

我们在数据库中存储了一个json,其中包含一个国家/地区映射:

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

所以这意味着新加坡的4类别在日本是128。我们其实是 使用这样的结构来映射各国的类别。

我有这个界面来实现这个目标:

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

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

我有2个选项

  1. 使用java哈希映射存储为键/值
  2. 使用缓存框架并将其存储为键/值
  3. 由于

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是创建一个双向映射,如下所示,没有冗余,因为我们不存储对象,因为小字符串是不可变的,例如,单词&#34 ;电子"只存储在内存中一次。

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);
    }
}

答案 1 :(得分:0)

您可以使用HashMaps的HashMap执行以下操作:

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

第一个键(外部地图的键)是类别名称(例如电子设备),第二个键(内部地图的键)是位置名称。 这样您就可以通过2次HashMap访问有效地获取任何id。 您可以使用LinkedHashMap中的// setup browser var options = { desiredCapabilities: { browserName: 'chrome', chromeOptions: { args: ['user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/Profile 21v69', '--lang=en'] } // chromeOptions: { } // desiredCapabilities: { } // options = { var client = webdriverio.remote(options).init(); 来限制HashMap大小,使其成为LRU(或任何其他策略)缓存。 除此之外,您可以使用Java缓存框架,如EHCache或OSCache。