我有两个类,class1和class2
它们都有不同的属性,但它们都有时间戳和事务ID
实时,任何transactionID都有一个class1实例和一个class2实例
我当前要存储的结构是使用class1的哈希映射,以及class2的哈希映射,如下所示:
hashmap <transactionID, class1>
hasmap <transactionID, class2>
现在我得到了一个新的要求,即缓存两个类的实例,并根据它们具有的timestamp属性来定制它们。
我正在思考并寻找一种很好的方法来做到这一点。我遇到Guava
,但是Guava根据密钥存储对象,在我的情况下,密钥是不唯一的事务ID。
我希望能够根据时间戳属性对两个类的实例进行排序(排序)。我还想知道是否有一个数据结构可以帮助你完成订单。
我知道我可以迭代任何结构并自己处理实例,但应该有一个比这个teduis过程更好的方法
答案 0 :(得分:0)
番石榴是一个很好的选择它MultiMap可以为同一个键值保存任意数量的元素。使用MultimapBuilder,您可以创建一个按键排序的MultiMap
。类似的东西:
Comparator<TransactionIdType> comparator = // implement Comparator for your TransactionIdType
ListMultimap<TransactionIdType, Object> multimap = MultimapBuilder.treeKeys(comparator).arrayListValues().build();
multimap.put(key1, value1);
multimap.put(key1, value2);
multimap.put(key2, value3);
MultiMap
将在同一个键(key1)下保存两个值(value1和value2)。
为了更好地实现您的值类型(在调用它们时为class1和class2),请实现一个通用接口,以便将ListMultimap<TransactionIdType, CommonInteface>
作为MultiMap
的参数化
已更新以添加缓存:
Guava还提供caching。现在,这将返回缓存中的所有条目,不确定这是否是您想要的,也许您将从getAllPresent而不是asMap开始。
// create cache
final Cache<TransactionIdType, Collection<CommonInterface>> cache = CacheBuilder.newBuilder().build();
// put the value in the cache
Collection<CommonInterface> values = cache.getIfPresent(key1);
if (values == null) {
values = new ArrayList<CommonInterface>();
}
values.add(type1a);
// get all cached entries, convert them to MultiMap
final Map<TransactionIdType, Collection<CommonInterface>> cacheAsMap = cache.asMap();
final Supplier<Collection<CommonInterface>> supplier = new Supplier<Collection<CommonInterface>>() {
public Collection<CommonInterface> get() {
return new ArrayList<CommonInterface>();
}
};
final Multimap<TransactionIdType, CommonInterface> base = Multimaps.newMultimap(cacheAsMap, supplier);
// sort the MultiMap
ListMultimap<TransactionIdType, CommonInterface> sorted = MultimapBuilder.treeKeys(comparator).arrayListValues().build(base);