Сравните два массива для любого подобного значения

Я хотел бы сравнить два массива, если хотя бы одно значение может быть найдено на обоих массивах.

Сценарий # 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, если хотя бы одно значение похоже на оба массива)

Ответ 1

Вы можете использовать Collections#disjoint,

Возвращает true, если две указанные коллекции не имеют элементов в общее.

...

Обратите внимание, что разрешено передавать один и тот же набор в обоих параметрах, и в этом случае метод вернет true тогда и только тогда, когда коллекция пуста.

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

Ответ 2

В 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).

Это версия java 8 ответа @Markus, хотя anyMatch() останавливает итерацию при совпадении.

ПРИМЕЧАНИЕ. Если длины x и y различны, подумайте о создании потока вокруг массива с меньшим количеством элементов. Это связано с тем, что метод HashSet.contains() работает в O(1), амортизированное время, независимо от длины set, поэтому для наихудшего случая итерация меньше времени имеет лучшую производительность.

Ответ 3

Кажется, вы играете с массивом, поэтому я не буду использовать магические классы здесь. Просто с чистыми массивами вы можете сделать

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;
}

Ответ 5

Это довольно специфическая потребность, и я не думаю, что для любой из популярных библиотек коллекции есть специальная функция для этого. Вы можете сделать:

Collection<String> set = new HashSet<String>(Arrays.asList(x));
boolean result = false;
for (String str: y) {
    result |= set.contains(str);
}

Что имеет сложность O (n), а не O (n ^ 2) итерации через оба массива и сравнение элемента по элементу.

Ответ 7

Это может помочь. Измените оператор печати, чтобы вернуть 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]);
        }
    }
}

Ответ 8

Решение может заключаться в том, что вы можете итерировать значение 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);
    }
}