繁体   English   中英

检查两个列表(一个是嵌套的)是否互斥

[英]Check if two lists (one is nested) are mutually exclusive

我想比较两个列表(一个是嵌套的)的互斥性。 问题是即使它们只有一个共同元素,这段代码也会打印错误。 如果它们具有共同的两个元素,我需要它打印 false 。

output 我得到: false true false

所需 output: true true false

...
ArrayList<String> properties = new ArrayList<>(Arrays.asList("A", "B"));
ArrayList<ArrayList<String> > pairs = new ArrayList<ArrayList<String> >();

pairs.add(new ArrayList<>(Arrays.asList("A", "C")));
pairs.add(new ArrayList<>(Arrays.asList("D", "C")));
pairs.add(new ArrayList<>(Arrays.asList("A", "B")));

for(int i = 0; i< pairs.size(); i++) {
    System.out.println(Collections.disjoint(properties, pairs.get(i)));
} 

所以,正如我在编辑后现在理解你的问题一样,你让它变得太难了。 如果您只是在寻找不相等的列表,那么这里不需要Collections.disjoint() 如果你想在遇到内容相同的列表时打印false ,为什么不简单地使用equals()呢?

所以支票变成了

for (int i = 0; i < pairs.size(); i++) {
   System.out.println(!properties.equals(pairs.get(i)));
}

打印以下内容 output

true
true
false

Collection.containsAll()

我想比较两个列表(一个是嵌套的)的互斥性。 问题是即使它们只有一个共同元素,这段代码也会打印false 如果它们具有共同的两个元素,我需要它打印false

如果您想确定两个具有相同大小的列表是否包含相同的元素而不管它们的顺序如何,那么您可以使用方法Collection.containsAll()

List<String> properties = List.of("A", "B");
List<List<String>> pairs = List.of(
    List.of("A", "C"), List.of("D", "C"), List.of("A", "B")
);
        
for (List<String> pair : pairs) {
    System.out.println(!properties.containsAll(pair));
}

笔记

  • 仅当两个列表包含相同顺序的相同元素时, List接口的所有实现的equals方法才会返回true (如果您不希望考虑顺序,则equals不适合此任务)。

  • containsAll()的使用只有在您调用此方法的列表大小适中时才是合理的。 在这种情况下,这是完全可以接受的,因为列表中只有2元素。 否则,基于properties列表(如果所有元素都是唯一的)创建一个HashSet并针对该集合执行检查(如果列表中可能有重复项,我们可以生成HashMap的元素频率)是性能明智的做法。

  • 您可能想阅读“对接口编程”是什么意思?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM