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