[英]How to search element in a List?
我有两个列表,例如:
列表 1:只有一个元素
List<String> ids=new ArrayList<String>();
列表 2:有 1000 个对象
List<ABC> abc= new ArrayList<ABC>();
a.matIDS
注意:matIDS 是字符串集合(例如:abc,def,ghi)
for(ABC a : abc){
for(String id : a.matIDs()){
if(ids.contains(id)){
LOG.info("ID found:::");
}else{
LOG.info("ID NOT found:::");
}
}
}
题:
在列表 1 中只有 1 个元素,而在列表 2 中有 1000 个元素。我是否需要检查所有这些 1000 个元素才能找到第 1 个元素?
有没有更好的办法?
如果您确实需要针对另一个集合快速查找一个列表中的一个(或多个)值,那么最快的数据结构可能是针对一组进行搜索:
Set<String> set = new HashSet<>(abc);
然后,您可以迭代第一个列表并在另一个集合中以恒定时间查找每个条目:
for (String id : ids) {
if (set.contains(id)) {
LOG.info("ID found:::");
}
else {
LOG.info("ID NOT found:::");
}
}
这是对您当前的蛮力方法的改进,即O(n*m)
,其中n
和m
是ids
和abc
列表的大小。 现在,运行时间只是O(m)
,即ids
列表的大小。
如果“更好”的意思更清楚,那么也许您可以考虑使用流:
abc.stream().flatMap(ABC::matIDs).anyMatch(ids::contains);
您是否认为这“更好”取决于您的追求。
如果您定期检查特定 ID 是否在列表中,那么您可以收集一组 ID:
Set<String> abcIDs = abc.stream().flatMap(ABC::matIDs).collect(toSet());
然后检查特定字符串是否在集合中是微不足道的,而不必返回原始列表。
您可以优化现有代码以在找到匹配项时退出循环。
booean isFound=false;
for(ABC a : abc){
for(String id : a.matIDs()){
if(ids.contains(id)){
isFound=true;
break;
}
}
if(isFound)
break;
}
if(isFound)
LOG.info("ID found:::");
else
LOG.info("ID NOT found:::");
你也可以使用流,
boolean isFound=abc.stream().flatMap(e-> e.matIDS.stream()).anyMatch(ids::contains);
if(isFound)
LOG.info("ID found:::");
else
LOG.info("ID NOT found:::");
要查找匹配的元素,您可以使用filter
并在Set
收集
Set<String> matchedElements=abc.stream()
.flatMap(e-> e.matIDS.stream())
.filter(ids::contains)
.collect(Collectors.toSet());
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.