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

检查一个列表是否包含另一个列表中的元素

郁隐水
2023-03-14

我有两个不同对象的列表。

List<Object1> list1;
List<Object2> list2;

我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。

现在,我是这样做的:

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

但我认为有更好更快的方法可以做到这一点:)有人能提出吗?

谢谢

共有3个答案

曹沛
2023-03-14

您可以使用Apache Commons CollectionUtils:

if(CollectionUtils.containsAny(list1,list2)) {  
    // do whatever you want
} else { 
    // do other thing 
}  

这假设您已经正确地重载了自定义对象的equals功能。

夏奕
2023-03-14

要缩短Narendra的逻辑,可以使用以下方法:

boolean var = lis1.stream().anyMatch(element -> list2.contains(element));
苏昊英
2023-03-14

如果您只需要测试基本相等性,那么可以使用基本JDK来完成,而无需修改一行中的输入列表

!Collections.disjoint(list1, list2);

如果你需要测试一个特定的属性,那就更难了。我建议,默认情况下,

list1.stream()
   .map(Object1::getProperty)
   .anyMatch(
     list2.stream()
       .map(Object2::getProperty)
       .collect(toSet())
       ::contains)

...它收集list2中的不同值,并测试list1中的每个值是否存在。

 类似资料:
  • 问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在

  • 问题内容: 我有两个列表,一个包含 相册,文件对的 列表,另一个仅包含有关一张照片的信息- 相册 (位置0)和 文件 (位置1) 如何查看 照片 列表是否在 照片 列表中?就像字符串一样。 相册 , 文件的 位置无关紧要,因为不会有任何 文件 等于 相册 。 问题答案: 同样喜欢字符串。不仅如此,也是 如此 。也适用于列表中的列表: 对列表的成员资格测试仅迭代列表,并对每个元素使用相等性测试以查看

  • 问题内容: 我有一个产品ID列表,我想找出哪些订单包含所有这些产品。订单表的结构如下: 显然,我可以使用PHP中的一些循环来做到这一点,但是我想知道是否有一种优雅的方法可以完全在mysql中完成。我理想的幻想查询将是这样的: 有希望还是我应该去阅读托尔金?:)另外,出于好奇,如果不能在mysql中使用,是否还有其他具有此功能的数据库? 问题答案: 你很亲密 关于关系代数中的“出于好奇”问题,这可以

  • 问题内容: 我有一个清单: 并要搜索包含字符串“ abc”和“ def”(以及其他错误的字符串)的项目。我怎样才能做到这一点? 这里几乎是同样的问题。 问题答案: 如果只需要测试,请将目标列表连接到字符串中,然后像这样测试每个元素: 从您的问题中,您可以通过以下方式将每个元素作为子字符串相对于另一个元素的子字符串进行测试: 它非常快(与其他方法之一相比): 从您的评论中,您可以找到不匹配的元素:

  • 问题内容: 我正在尝试比较两个列表,如果第二个列表中有第一个列表中的任何值,则只打印一条消息。 在此示例中,我要对进行求值,因为两个列表中都包含5。这行不通,而且我不确定比较这两个列表的最简单方法。 问题答案: 您可以用很多方法解决。一个很容易理解的方法就是只使用一个循环。 一个更紧凑的方法是使用和: 更好的是,可以将其替换为: 您还可以使用集合:

  • 问题内容: 如何测试一个列表是否包含另一个列表(即它是一个连续的子序列)。假设有一个名为contains的函数: 编辑: 问题答案: 这是我的版本: 正如安德鲁·贾菲(Andrew Jaffe)在他的评论中指出的那样,它返回一个元组(start,end + 1),因为我认为这更像pythonic。它不对任何子列表进行切片,因此应该相当有效。 新手感兴趣的一点是,它使用了for语句上的else子句-