Сравните два массива для любого подобного значения
Я хотел бы сравнить два массива, если хотя бы одно значение может быть найдено на обоих массивах.
Сценарий # 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) итерации через оба массива и сравнение элемента по элементу.
Ответ 6
Вы можете использовать java.util.Set
, например. HashSet
для этого:
- Вставьте все элементы из
x
в набор
- Используйте
Set#contains(Object)
, чтобы проверить, содержит ли набор какие-либо элементы из y
http://docs.oracle.com/javase/8/docs/api/java/util/Set.html
http://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html
Ответ 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);
}
}