当前位置: 首页 > 知识库问答 >
问题:

如何在列表中搜索元素?

司马昕
2023-03-14

我有两个清单,例如:

列表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个元素吗?

有没有更好的办法?

共有3个答案

符正信
2023-03-14

如果您确实需要针对另一个集合快速查找一个列表中的值(或多个值),那么最快的数据结构可能是针对一组进行搜索:

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),其中 nmidabc 列表的大小。现在,运行时间只是O(m)即ids列表的大小。

龙逸清
2023-03-14

如果你说的“更好”是指更清晰,那么也许你可以考虑使用streams:

abc.stream().flatMap(ABC::matIDs).anyMatch(ids::contains);

你是否认为这“更好”取决于你想要什么。

如果您定期检查某个ID是否在列表中,那么您可以收集一组ID:

Set<String> abcIDs = abc.stream().flatMap(ABC::matIDs).collect(toSet());

然后,检查某个特定字符串是否在集合中是很简单的,无需返回原始列表。

洪璞瑜
2023-03-14

您可以优化现有代码以在找到匹配时退出循环。

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查询可以执行的操作的更多信息,请尝试使