我为com.googlecode.cqengine.IndexedCollection
对象配置了NavigableIndex
。通常,我需要从索引或索引的迭代器中获取第一项或最后一项。
我认为这应该是微不足道的。我知道我可以使用queryOptions对象创建Query对象,使用它从IndexedCollection检索迭代器并获取第一个对象,但是我不确定它是否对性能最佳。当然,这并不优雅。
答案 0 :(得分:1)
在miradham的帮助下,我发现我需要记住索引,因为如果我们拥有更多的索引,则很难选择正确的索引。它仅适用于NavigableIndex
,我们不能迭代基类Index
collection = new ConcurrentIndexedCollection<Data>();
index = NavigableIndex.onAttribute(Data.UNIQUE_TIMESTAMP);
collection.addIndex(index);
当我有索引时:
try (CloseableIterator<KeyValue<String, Data>> iterator = indexUniqueTimestamp.getKeysAndValuesDescending(null).iterator()) {
if (iterator.hasNext())
return iterator.next().getValue();
}
return null;
答案 1 :(得分:1)
根据其属性之一检索最小或最大(即第一个或最后一个)对象的一个技巧是使用all()
查询(与集合中的所有对象匹配),并请求该结果应该以属性的升序或降序返回。
例如,如果您有一组Car对象,则可以使用以下代码来检索价格最高(即最高)的汽车:
try (ResultSet<Car> results = cars.retrieve(
all(Car.class),
queryOptions(
orderBy(descending(Car.PRICE)),
applyThresholds(
threshold(INDEX_ORDERING_SELECTIVITY, 1.0)
)
))) {
results.stream()
.limit(1)
.forEach(System.out::println);
}
如果您希望退还前n名最昂贵的汽车,也可以将限制更改为1以外的值。
无论您是否实际使用价格NavigableIndex
,以上代码都将起作用。关于INDEX_ORDERING_SELECTIVITY的一点是实际上要求CQEngine利用索引(更多详细信息here)。
答案 2 :(得分:0)
或一般而言索引的迭代器
您可以使用QueryEngine interface的getIndexes()
API来检索索引集。
示例代码:
IndexedCollection<Car> indexedCollection = new ConcurrentIndexedCollection<Car>();
indexedCollection.addIndex(HashIndex.onAttribute(Car.CAR_ID), noQueryOptions());
List<Index<Car>> indexes = new ArrayList<Index<Car>>();
for (Index<Car> index : indexedCollection.getIndexes()) {
indexes.add(index);
}
答案 3 :(得分:-1)
NavigableIndex将对象存储在Map中的元素中,其中属性作为键,对象集作为值。
NavigableIndex不维护插入顺序。索引的第一个元素可以是任何东西。
CQEngine最好用于随机访问集合中的对象而不是顺序访问。
java中的普通集合最适合使用索引进行序列访问。
访问第一个元素的一种优雅方法是创建SequentialIndex类并将其添加到并发集合中。使用索引作为查询来检索元素。