首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NavigableIndex从cqengine IndexedCollection获取第一项或最后一项

如何使用NavigableIndex从cqengine IndexedCollection获取第一项或最后一项
EN

Stack Overflow用户
提问于 2018-07-12 22:45:53
回答 3查看 632关注 0票数 5

我有一个配置了NavigableIndexcom.googlecode.cqengine.IndexedCollection对象。一般情况下,我需要从索引或索引的迭代器中获取第一个或最后一个项目。

我想这应该是微不足道的。我知道我可以使用queryOptions对象创建Query对象,使用它从IndexedCollection中检索迭代器并获取第一个对象,但我不确定它是否具有最佳的性能。当然,这并不优雅。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-24 18:52:33

在miradham的帮助下,我发现我需要记住索引,因为如果我们有更多的索引,很难选择正确的索引。它只适用于NavigableIndex,我们不能迭代基类Index

代码语言:javascript
复制
collection = new ConcurrentIndexedCollection<Data>();
index = NavigableIndex.onAttribute(Data.UNIQUE_TIMESTAMP);
collection.addIndex(index);

当我有了索引时:

代码语言:javascript
复制
try (CloseableIterator<KeyValue<String, Data>> iterator = indexUniqueTimestamp.getKeysAndValuesDescending(null).iterator()) {
        if (iterator.hasNext())
            return iterator.next().getValue();
    }
    return null;
票数 1
EN

Stack Overflow用户

发布于 2018-12-06 08:01:26

根据属性之一检索最小或最大(即第一个或最后一个)对象的一个技巧是使用all()查询(它匹配集合中的所有对象),并请求以属性的升序或降序返回结果。

例如,如果您有一个汽车对象集合,则可以使用以下代码来检索具有最高(即最高)价格的汽车:

代码语言:javascript
复制
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)。

票数 1
EN

Stack Overflow用户

发布于 2018-07-25 00:43:27

NavigableIndex将对象存储在映射的元素中,属性作为键,对象集作为值。

NavigableIndex不保持插入顺序。索引的第一个元素可以是任何内容。

CQEngine最适合随机访问集合中的对象,而不是顺序访问。

java中的普通集合最适合于带索引的序列访问。

访问第一个元素的一种优雅方法是创建SequentialIndex类并将其添加到并发集合中。使用索引作为查询来检索元素。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51308612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档