多个索引的数据结构 用guavaTable.md
开发中经常遇到多列索引的内存数据结构,原来的做法是 用 Map<key100, Map<key200, Object>>来实现,稍复杂[写着不方便,用着也不方便;代码也不好理解]。 其实guava 有封装好的 Table 集合类型,来满足次业务场景。 Table支持“row”和“column”,而且提供多种视图。
Table<Integer, Integer, String> table = HashBasedTable.create();
table.put(1, 1, "11");
table.get(1,1);
项目代码
/**
* key=用户id ,value = 多列索引 table key1:活动id key2:是指标id
*/
private LoadingCache<String, Table<String, String, ActivityLatestData>> dataCache;
dataCache = CacheBuilder.newBuilder().maximumSize(5000).build(
new CacheLoader<String, Table<String, String, ActivityLatestData>>() {
public Table<String, String, ActivityLatestData> load(String userId) throws Exception {
return getUserTableData(userId);
}
}
);
table初始化
private Table<String, String, ActivityLatestData> getUserTableData(String userId) {
Table<String, String, ActivityLatestData> table = HashBasedTable.create();
IActivityLatestDataService userService =PointApp.getService(IActivityLatestDataService.class);
ActivityLatestData pojo = new ActivityLatestData();
pojo.setUserId(userId);
List<ActivityLatestData> datas = userService.getByPojo(pojo);
for (ActivityLatestData data : datas) {
table.put(data.getActivityId(), data.getMetricId(), data);
}
return table;
}
```
获取数据
```
ActivityLatestData latestData = table.get(activity.getId(), metricId);
```