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

Ned*_*Ned 94 java element list find

我有两个列表,其中包含不同的对象.

List<Object1> list1;
List<Object2> list2;
Run Code Online (Sandbox Code Playgroud)

我想根据特定属性(Object1和Object2具有(等等),一个相互属性(类型为Long),名为attributeSame)来检查list1中是否存在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;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Lou*_*man 207

这可以使用基本JDK完成,而无需修改一行中的输入列表

!Collections.disjoint(list1, list2);
Run Code Online (Sandbox Code Playgroud)

  • 此外,请注意,对于列表,这将是O(n*m); 如果你愿意在比较之前将`list1`复制到`Set`中,你将获得O(n)+ O(m),即O(n + m),代价是一些额外的RAM; 这是在速度或记忆之间进行选择的问题. (13认同)
  • 不?不相交测试两个集合之间是否没有彼此相等的对象。 (2认同)

Woo*_*Moo 38

您可以使用Apache Commons CollectionUtils:

if(CollectionUtils.containsAny(list1,list2)) {  
    // do whatever you want
} else { 
    // do other thing 
}  
Run Code Online (Sandbox Code Playgroud)

这假设您已正确重载自定义对象的equals功能.

  • 已经4年了,我也明确地说出了包装和功能. (9认同)
  • @ohcibi Java也有一个内置的记录器,你应该在你使用Logtj和Log4j2的时候向下投票. (7认同)
  • 当只有 jdk 的解决方案时,对 apache commons 投反对票 (3认同)
  • @ohcibi 但如果您已经在使用 Apache 公共资源,那么它并不是真的膨胀。这是一个很好的答案。 (2认同)

Har*_*ngh 9

一种Collection命名方法,retainAll但有一些副作用供您参考

仅保留此列表中包含在指定集合中的元素(可选操作).换句话说,从该列表中删除未包含在指定集合中的所有元素.

如果此列表因调用而更改,则为true

就像是

boolean b = list1.retainAll(list2);
Run Code Online (Sandbox Code Playgroud)


小智 6

要缩短Narendra的逻辑,可以使用以下命令:

boolean var = lis1.stream().anyMatch(element -> list2.contains(element));
Run Code Online (Sandbox Code Playgroud)

  • 如果需要,您可以再缩短一点:`list1.stream().anyMatch(list2::contains);` (8认同)
  • 这个答案没有得到充分重视。 (4认同)

Mat*_*aga 5

Loius的回答是正确的,我只想添加一个例子:

listOne.add("A");
listOne.add("B");
listOne.add("C");

listTwo.add("D");
listTwo.add("E");
listTwo.add("F");      

boolean noElementsInCommon = Collections.disjoint(listOne, listTwo); // true
Run Code Online (Sandbox Code Playgroud)