java如何从两个类缓存对象,仍然可以根据它们的时间戳来对它们进行排序

时间:2015-10-26 17:31:20

标签: java algorithm caching

我有两个类,class1和class2

它们都有不同的属性,但它们都有时间戳和事务ID

实时,任何transactionID都有一个class1实例和一个class2实例

我当前要存储的结构是使用class1的哈希映射,以及class2的哈希映射,如下所示:

hashmap <transactionID, class1>
hasmap <transactionID, class2>

现在我得到了一个新的要求,即缓存两个类的实例,并根据它们具有的timestamp属性来定制它们。

我正在思考并寻找一种很好的方法来做到这一点。我遇到Guava,但是Guava根据密钥存储对象,在我的情况下,密钥是不唯一的事务ID。

我希望能够根据时间戳属性对两个类的实例进行排序(排序)。我还想知道是否有一个数据结构可以帮助你完成订单。

我知道我可以迭代任何结构并自己处理实例,但应该有一个比这个teduis过程更好的方法

1 个答案:

答案 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);