我有两个清单,例如:
列表1:只有一个元素
List<String> ids=new ArrayList<String>();
列表2:有1000个对象
List<ABC> abc= new ArrayList<ABC>();
a.matIDS
注意:矩阵是字符串集合(例如:abc,定义,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
是 id
和 abc
列表的大小。现在,运行时间只是O(m)
,即ids
列表的大小。
如果你说的“更好”是指更清晰,那么也许你可以考虑使用streams:
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:::");
要查找匹配的元素,您可以在集合
中使用过滤
和收集
Set<String> matchedElements=abc.stream()
.flatMap(e-> e.matIDS.stream())
.filter(ids::contains)
.collect(Collectors.toSet());
希望能有所帮助。
问题内容: 如何在SQL Server中搜索表的所有列? 问题答案: 如果您正在寻找完全的全场比赛。如果要查找子字符串匹配项,则必须进行很长的路要走:
问题内容: 我有一个对象列表,列表很大。对象是 现在,我必须在列表中搜索对象的特定值。假设 我必须返回那些对象(我的搜索并不总是基于value3) 清单是 有效的方法是什么? 谢谢。 问题答案: 您可以尝试使用Apache Commons Collections。 有一个CollectionUtils类,允许您通过自定义谓词选择或过滤项目。 您的代码将如下所示: 更新: 在 java8中 ,使用
问题内容: 我想在arraylist中搜索一个字符串。我的ArrayList包含: 现在我要搜索,它应该返回包含和的列表。我该如何实施? 问题答案:
我有一个对象列表,列表很大。对象是 现在我必须在列表中搜索一个对象的特定值。假设我必须返回这些对象(我的搜索不总是基于value3) 该列表为
我在WordPress中进行自定义搜索。有三个字段可供搜索。 年龄 位置 职称 从
问题内容: 我正在尝试提供一种搜索功能,该功能将搜索多列以查找基于关键字的匹配项。该查询: 仅适用于搜索一列,我注意到用逗号分隔列名称会导致错误。那么可以在mysql中搜索多个列吗? 问题答案: 您可以使用AND或OR运算符,具体取决于要返回的搜索内容。 这两个子句必须匹配才能返回记录。或者: 如果任一子句匹配,则将返回记录。 有关使用MySQL SELECT查询可以执行的操作的更多信息,请尝试使