首页 > 解决方案 > 在元素集列表中查找元素的属性

问题描述

我需要在一组元素的列表中找到一个元素的键。有什么更好(更快)的方法来做到这一点?这是我的代码:

// get tags from an ArrayList of resources
boolean tagFound = false;
HashSet<Tag> resourceTags = new HashSet<>();
for (Resource resource : list) {
    Set<Tag> tmpTags = resource.getTags();
    resourceTags.addAll(tmpTags);
}

// get tag keys from all tags
for (Tag resourceTag : resourceTags) {
    if (resourceTag.getKey().equals(tag.getKey())) {
        tagFound = true;
        break;
    }
}

标签: javaperformancecollections

解决方案


addAll如果您要做的只是再次遍历它以找到一个事件,那么您可以简单地摆脱开销。

for (Resource resource : list) {
    for (Tag resourceTag : resource.getTags()) {
        if (resourceTag.getKey().equals(tag.getKey())) {
            tagFound = true;
            break;
        }
    }
}

如果要以函数式方式编写,它看起来像:

boolean tagFound = list.stream()
        .flatMap(r -> r.getTags().stream())
        .anyMatch(t -> t.getKey().equals(tag.getKey()));

注意:在性能方面,在R x T矩阵中,您必须支付O(R x T)运行时间来搜索元素,除非它们被散列。在后一种情况下,如果例如Tag被散列,您可以简单地执行contains基于keyto 的查找来O(1)代替。


推荐阅读