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

vecaoik1  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(155)

我想比较两个列表(一个是嵌套的)的互斥性。问题是,即使它们只有一个共同的元素,这个代码也打印false。我需要它打印false,如果它们有两个共同的元素。
我得到的输出:false true false
所需输出: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)));
}
zbq4xfa0

zbq4xfa01#

所以,在你编辑之后,我现在理解你的问题,你把它弄得太难了。如果你只是寻找 * 不相等 * 的列表,这里没有必要使用Collections.disjoint()。如果你想在遇到内容相同的列表时打印false,为什么不简单地使用equals()呢?
所以支票变成了

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

打印以下输出

true
true
false
eufgjt7s

eufgjt7s2#

第一个月

我想比较两个列表(一个是嵌套的)的互斥性。问题是这段代码打印false,即使它们只有一个共同的元素。我需要它打印false,如果它们有两个共同的元素
如果你想确保两个大小相等的List包含相同的元素而不管它们的顺序,那么你可以使用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()方法的列表大小适中时,使用containsAll()才是合理的。在这种情况下,完全可以接受,因为列表中只有2元素。否则,基于properties列表创建一个HashSet将是性能明智的(如果所有元素都是唯一的),并针对该集合执行检查(如果列表中可能存在重复项,则可以生成HashMap的元素频率)。
  • 你可能想读What does it mean to "program to an interface"?

相关问题