Рубрики
Без рубрики

Java: Проверьте, содержит ли массив значение или элемент

В этом уроке мы рассмотрим примеры того, как проверить, содержит ли массив Java определенный элемент или значение. Мы будем использовать список, потоковый API, а также Apache Commons.

Автор оригинала: Branko Ilic.

Вступление

Независимо от того, используется ли Java или любой другой язык программирования, проверка того, содержит ли массив значение, является обычным явлением. Это одна из вещей, которой, как правило, учатся большинство новичков, и это полезная вещь, которую нужно знать в целом.

В этой статье мы рассмотрим как проверить, содержит ли массив значение или элемент в Java .

  • Массивы.asList().содержит()
  • Использование цикла for
  • Коллекции.BinarySearch()
  • Потоковый API Java 8
  • Apache Commons – ArrayUtils

Массивы.asList().содержит()

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

Сначала мы преобразуем массив в ArrayList . Существуют различные способы преобразования массива Java в список массивов , однако мы будем использовать наиболее широко используемый подход.

Затем мы можем использовать метод contains() для результирующего ArrayList , который возвращает логическое значение , указывающее, содержит ли список элемент, который мы ему передали, или нет.

Массив типа Целое число :

Integer[] intArray = new Integer[]{1, 2, 3, 4, 5};
String[] nameArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};

List intList = new ArrayList<>(Arrays.asList(intArray));
List nameList = new ArrayList<>(Arrays.asList(nameArray));

System.out.println(intList.contains(12));
System.out.println(nameList.contains("John"));

Выполнение этого кода приводит к:

false
true

Использование цикла for

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

Давайте сначала начнем с примитивных целых чисел:

int[] intArray = new int[]{1, 2, 3, 4, 5};
boolean found = false;
int searchedValue = 2;

for(int x : intArray){
	if(x == searchedValue){
        found = true;
        break;
    }
}

System.out.println(found);

Переменная found изначально имеет значение false , потому что единственный способ вернуть true – это найти элемент и явно присвоить логическому значению новое значение. Здесь мы просто сравниваем каждый элемент массива со значением, которое мы ищем, и возвращаем true , если они совпадают:

true

Для строк и пользовательских объектов, которые могут быть в вашем коде, вы будете использовать другой оператор сравнения. Предполагая, что вы действительно переопределили метод equals () , вы можете использовать его для проверки того, равен ли объект другому, возвращая true , если они:

String[] stringArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};
boolean found = false;
String searchedValue = "Michael";

for(String x : stringArray){
    if(x.equals(searchedValue)){
        found = true;
        break;
    }
}

System.out.println(found);

Выполнение этого кода приведет к:

false

Коллекции.BinarySearch()

Кроме того, мы можем найти определенное значение с помощью встроенного метода двоичного поиска() из класса Коллекции . Проблема с двоичным поиском заключается в том, что он требует, чтобы наш массив был отсортирован . Если ваш массив | отсортирован, двоичный поиск () превосходит как Arrays.asList().содержит () , так и подходы для цикла.

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

двоичный поиск() имеет множество перегруженных вариантов в зависимости от используемых типов и наших собственных требований, но наиболее общим является:

public static int binarySearch(Object[] a, Object[] key)

Где a представляет массив и ключ указанное значение, которое мы ищем.

Теперь возвращаемое значение может немного сбивать с толку, поэтому лучше всего иметь в виду официальную документацию Oracle:

Возвращаемым значением этого метода является индекс искомого ключа, если он содержится в массиве; в противном случае (-( точка вставки ) – 1), где точка вставки определяется как точка, в которой ключ будет вставлен в массив: индекс первого элемента больше ключа или a.длина , если все элементы в массиве меньше указанного ключа.

Давайте попробуем это:

Integer[] intArray = new Integer[]{1, 2, 3, 4, 5};
String[] nameArray = new String[]{"Bill", "Connor", "Joe", "John", "Mark"}; // Array is already sorted lexicographically

List intList = new ArrayList<>(Arrays.asList(intArray));
List nameList = new ArrayList<>(Arrays.asList(nameArray));
System.out.println(Collections.binarySearch(intList, 2));
System.out.println(Collections.binarySearch(nameList, "Robin"));

Это выведет:

1
-6

Первый элемент найден в позиции 1 . Второй элемент не найден и будет вставлен в позицию 5 – в конце массива. Возвращаемое значение равно -(точка вставки)-1 , поэтому возвращаемое значение в конечном итоге равно -6 .

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Если значение выше равно или выше 0 , массив содержит элемент, и в противном случае он его не содержит.

Потоковый API Java 8

API потока Java 8 очень универсален и предлагает лаконичные решения для различных задач, связанных с обработкой коллекций объектов. Использование потоков для такого типа задач естественно и интуитивно понятно для большинства.

Давайте посмотрим, как мы можем использовать API потока, чтобы проверить, содержит ли массив целое число:

Integer[] arr = new Integer[]{1, 2, 3, 4, 5};

System.out.println(Arrays.stream(arr).anyMatch(x -> x == 3));

Это выведет:

true

И для этого используйте строки или пользовательские объекты:

String[] arr = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};

String searchString = "Michael";

boolean doesContain = Arrays.stream(arr)
        .anyMatch(x -> x.equals(searchString));

System.out.println(doesContain);

Или вы можете сделать это короче, используя ссылку на метод:

boolean doesContain = Arrays.stream(arr)
        .anyMatch(searchString::equals);
        
System.out.println(doesContain);

Оба из них будут выводить:

false

Apache Commons – ArrayUtils

Библиотека Apache Commons предоставляет множество новых интерфейсов, реализаций и классов, которые расширяют базовую платформу Java и присутствуют во многих проектах.

Класс ArrayUtils представляет множество методов для управления массивами, включая метод contains() :

Integer[] intArray = new Integer[]{1, 2, 3, 4, 5};
String[] nameArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"};

System.out.println(ArrayUtils.contains(intArray, 3));
System.out.println(ArrayUtils.contains(nameArray, "John"));

Это привело бы к:

true
true

Вывод

В этой статье мы рассмотрели несколько способов проверки того, содержит ли массив в Java определенный элемент или значение. Мы перешли к преобразованию массива в список и вызову метода contains () , используя цикл for, потоковый API Java 8, а также Apache Commons.