比较两个数组是否有相同的值

11
我想要比较两个数组,如果至少有一个值可以在这两个数组中找到。 场景 #1 : 2 在这两个数组中都被找到,所以结果是true
String[] x = {"1","2","3"};
String[] y = {"2","5","6"};
情景 #2:没有匹配的值,因此结果为false
String[] x = {"1","2","3"};
String[] y = {"4","5","6"};

Java中是否有任何内置方法或库可以处理此要求?

我想强调的是,我正在寻找一个Java库或任何可以直接完成此操作的Java方法。

Collection.contains不是一个选项,因为两个数组中的所有值都应该相同才能返回true。(如果两个数组中至少有一个值相似,则需要返回true)


你的尝试是什么? - Suresh Atta
8个回答

11
你可以使用 Collections#disjoint 进行判断。

如果两个指定的集合没有共同元素,则返回 true。

...

请注意,允许在两个参数中传递相同的集合。此时,当且仅当集合为空时,该方法才会返回 true。

boolean isNoCommonElements = Collections.disjoint(
                                        Arrays.asList(x), Arrays.asList(y));

8
在Java 8中,您可以使用以下内容:
String[] x = { "1", "2", "3" };
String[] y = { "2", "5", "6" };

Set<String> set = new HashSet<>(Arrays.asList(y));
boolean result = Arrays.stream(x).anyMatch(set::contains); // true

这是一个时间复杂度为O(n)的算法。

这是 @Markus 答案的 Java 8 版本,尽管 anyMatch() 找到匹配项后就停止迭代。

注意: 如果 xy 的长度不同,考虑使用元素更少的数组创建流。这是因为 HashSet.contains() 方法的平均时间复杂度为 O(1),与 set 的长度无关,所以在最坏情况下,迭代次数越少,性能越好。


4

看起来你在使用数组,所以我这里不会使用任何神奇的类。只需要用纯数组,你就可以做到:

public boolean checkArrayEquals() {
    String[] x = { "1", "2", "3" };
    String[] y = { "2", "5", "6" };
    for (int i = 0; i < x.length; i++) {
        String xval = x[i];
        for (int j = 0; j < y.length; j++) {
            if (xval.equals(y[j])) {
                return true;
            }
        }
    }
    return false;
 }

4

虽然没有内置方法,但您可以编写自己的实用程序方法,该方法将使用 Set 并查找匹配项。

private boolean sharesAnElement(String[] a, String[] b) {
    Set<String> bSet = new HashSet<>(Arrays.asList(b));

    for (String str : a) {
        if (bSet.contains(str)) {
            return true;
        }
    }

    return false;
}

4
这是一个相当特殊的需求,我认为任何��行的集合库都没有专门的函数来实现。你可以这样做:
Collection<String> set = new HashSet<String>(Arrays.asList(x));
boolean result = false;
for (String str: y) {
    result |= set.contains(str);
}

相比于遍历两个数组并逐个比较元素的O(n^2)时间复杂度,这种方法具有O(n)的时间复杂度。


错误,你正在复制x,你正在将N个副本放入集合中 :) - wtsiamruk

2

2
这可能会有帮助。如果你想的话,将打印语句改为返回 true;。
for (int i = 0; i < x.length; i++) {
    for (int j = 0; j < y.length; j++) {
        if (x[i].equals(y[j])) {
            System.out.println(x[i] + " is equal to " + y[j]);
        }
    }
}

2
解决方案可以是:您可以迭代 array1 的值,并在第二个数组中搜索每个元素。
public static void compareArrays(String[] array1, String[] array2) {
    boolean b = false;

    for(String str1 : array1){
        for(String str2 : array2){
            if(str1 == str1){
                b = true;
                break;
            }
        }
    }
    System.out.println(b);
}

完整代码:
public class HelloWorld{

     public static void main(String []args){
        String[] x = {"1","2","3"};
        String[] y = {"3","5","6"};
        compareArrays(x, y);
     }

     public static void compareArrays(String[] array1, String[] array2) {
        boolean b = false;

        for(String str1 : array1){
            for(String str2 : array2){
                if(str1 == str1){
                    b = true;
                    break;
                }
            }
        }
        System.out.println(b);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接