java - 在元素集列表中查找元素的属性
问题描述
我需要在一组元素的列表中找到一个元素的键。有什么更好(更快)的方法来做到这一点?这是我的代码:
// 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;
}
}
解决方案
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
基于key
to 的查找来O(1)
代替。
推荐阅读
- vuejs2 - 在 REST API 上使用 FilePond 恢复或删除文件,并带有上传图像的动态 url
- jenkins - Jenkins 证书安装:ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- c# - 如何仅在具有比立方体大的 3D 平面的 3D 立方体内部进行渲染?
- pytorch - 什么使 BertGeneration 和/或 RobertaForCausalLM 因果模型?因果注意掩蔽发生在哪里?
- node.js - 无法在 Ubuntu 20 上安装 Gatsby
- c# - 调用 WNetGetUniversalName 后 Marshal.PtrToStringAuto 出现问题
- c# - 如何在 xamarin.ios 中将字节数组转换为位图?
- vowpalwabbit - 是否可以使用文件套接字而不是使用端口来运行 Vowpal Wabbit 守护程序?
- python - 如何在 jupyter 中正确导入 py 文件并访问在此 py 文件中也导入的模块?
- typescript - 当我使用 typescript compiler api 时,我发现接口 ClassDeclaration 包含可选属性“name”