我有一个配置了NavigableIndex的com.googlecode.cqengine.IndexedCollection对象。一般情况下,我需要从索引或索引的迭代器中获取第一个或最后一个项目。
我想这应该是微不足道的。我知道我可以使用queryOptions对象创建Query对象,使用它从IndexedCollection中检索迭代器并获取第一个对象,但我不确定它是否具有最佳的性能。当然,这并不优雅。
发布于 2018-07-24 18:52:33
在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;发布于 2018-12-06 08:01:26
根据属性之一检索最小或最大(即第一个或最后一个)对象的一个技巧是使用all()查询(它匹配集合中的所有对象),并请求以属性的升序或降序返回结果。
例如,如果您有一个汽车对象集合,则可以使用以下代码来检索具有最高(即最高)价格的汽车:
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);
}您还可以将限制更改为1以外的值,以防您希望退还前n辆最昂贵的汽车。
无论价格上是否有NavigableIndex,上面的代码都可以正常工作。关于INDEX_ORDERING_SELECTIVITY的部分实际上是请求CQEngine利用索引(更多详细信息here)。
发布于 2018-07-25 00:43:27
NavigableIndex将对象存储在映射的元素中,属性作为键,对象集作为值。
NavigableIndex不保持插入顺序。索引的第一个元素可以是任何内容。
CQEngine最适合随机访问集合中的对象,而不是顺序访问。
java中的普通集合最适合于带索引的序列访问。
访问第一个元素的一种优雅方法是创建SequentialIndex类并将其添加到并发集合中。使用索引作为查询来检索元素。
https://stackoverflow.com/questions/51308612
复制相似问题