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

Введение В Java или на любом другом языке программирования обычно проверяют, содержит ли массив значение. Это одна из вещей, которую обычно усваивают новички, и в целом это полезно знать. В этой статье мы рассмотрим, как проверить, содержит ли массив значение или элемент в Java. * Arrays.asList (). Contains () * Использование цикла for * Collections.binarySearch () * API потока Java 8 * Apache Commons - ArrayUtils Arrays.asList (). Contains () T

Вступление

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

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

Arrays.asList (). Contains ()

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

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

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

Массив Integer типа:

 Integer[] intArray = new Integer[]{1, 2, 3, 4, 5}; 
 String[] nameArray = new String[]{"John", "Mark", "Joe", "Bill", "Connor"}; 
 
 List<Integer> intList = new ArrayList<>(Arrays.asList(intArray)); 
 List<String> nameList = new ArrayList<>(Arrays.asList(nameArray)); 
 
 System.out.println(intList.contains(12)); 
 System.out.println(nameList.contains("John")); 

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

 false 
 true 

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

Более простой и ручной подход к решению проблемы - использование цикла 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 

Collections.binarySearch ()

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

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

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

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

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

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

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

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

 Integer[] intArray = new Integer[]{1, 2, 3, 4, 5}; 
 String[] nameArray = new String[]{"Bill", "Connor", "Joe", "John", "Mark"}; // Array is already sorted lexicographically 
 
 List<Integer> intList = new ArrayList<>(Arrays.asList(intArray)); 
 List<String> nameList = new ArrayList<>(Arrays.asList(nameArray)); 
 System.out.println(Collections.binarySearch(intList, 2)); 
 System.out.println(Collections.binarySearch(nameList, "Robin")); 

Это выведет:

 1 
 -6 

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

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

Java 8 Stream API

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

Давайте посмотрим, как мы можем использовать Stream 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 Framework, и присутствует во многих проектах.

Класс 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, Java 8 Stream API, а также Apache Commons.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus