как узнать есть ли элемент в массиве java
Проверьте, присутствует ли значение в массиве в Java
Для данного массива задача состоит в том, чтобы проверить, присутствует ли определенный элемент в этом массиве или нет в Java.
Примеры:
Ниже приведены различные способы сделать это:
Пример:
// Java-программа для проверки погоды
// элемент присутствует в массиве или нет
// Функция возвращает true, если данный элемент
private static void check( int [] arr, int toCheckValue)
// проверяем, указан ли элемент
// присутствует в массиве или нет
// используя метод линейного поиска
boolean test = false ;
for ( int element : arr) <
if (element == toCheckValue) <
System.out.println( «Is » + toCheckValue
+ » present in the array: » + test);
public static void main(String[] args)
// Получить проверяемое значение
int toCheckValue = 7 ;
// Проверить, является ли это значение
// присутствует в массиве или нет
В этом примере метод Arrays.binarySearch () используется для бинарного поиска.
Пример:
// Java-программа для проверки погоды
// элемент присутствует в массиве или нет
// Функция возвращает true, если данный элемент
private static void check( int [] arr, int toCheckValue)
// сортируем данный массив
// проверяем, указан ли элемент
// присутствует в массиве или нет
// используя метод двоичного поиска
int res = Arrays.binarySearch(arr, toCheckValue);
System.out.println( «Is » + toCheckValue
+ » present in the array: » + test);
public static void main(String[] args)
// Получить проверяемое значение
int toCheckValue = 7 ;
// Проверить, является ли это значение
// присутствует в массиве или нет
Пример:
// Java-программа для проверки погоды
// элемент присутствует в массиве или нет
// Функция возвращает true, если данный элемент
private static void check(Integer[] arr, int toCheckValue)
// проверяем, указан ли элемент
// присутствует в массиве или нет
// используя метод contains ()
System.out.println( «Is » + toCheckValue
+ » present in the array: » + test);
public static void main(String[] args)
// Получить проверяемое значение
int toCheckValue = 7 ;
// Проверить, является ли это значение
// присутствует в массиве или нет
Пример 1. Использование метода Stream.of () для создания Stream
// Java-программа для проверки погоды
// элемент присутствует в массиве или нет
// Функция возвращает true, если данный элемент
private static void check( int [] arr, int toCheckValue)
// проверяем, указан ли элемент
// присутствует в массиве или нет
// используя метод anyMatch ()
System.out.println( «Is » + toCheckValue
+ » present in the array: » + test);
public static void main(String[] args)
// Получить проверяемое значение
int toCheckValue = 7 ;
// Проверить, является ли это значение
// присутствует в массиве или нет
Пример 2. Использование метода Arrays.stream () для создания Stream
// Java-программа для проверки погоды
// элемент присутствует в массиве или нет
// Функция возвращает true, если данный элемент
private static void check( int [] arr, int toCheckValue)
Как определить, содержит ли массив определенное значение в Java?
у меня есть String[] С такими значениями:
27 ответов:
предупреждение: это не работает для массивов примитивов (см. комментарии).
С java-8
пример
просто, чтобы очистить код для начала. У нас есть (исправлено):
это изменчивая статика, которая FindBugs скажет вам, что это очень непослушно. Он должен быть частным:
(обратите внимание, вы можете на самом деле бросить
есть методы, доступные для примитивных массивов всех видов.
пример:
Я удивлен, что никто не предложил просто реализовать его по руке:
благоустройство:
Если массив не отсортирован, вам придется перебирать все и вызывать equals на каждом.
Если массив отсортирован, вы можете сделать двоичный поиск, есть один в массивы класса.
вообще говоря, если вы собираетесь сделать много проверок членства, вы можете хранить все в наборе, а не в массиве.
1) Используя Список:
3) используя простой цикл:
4) Использование Массивов.binarySearch ():
приведенный ниже код неверен, он указан здесь для полноты. binarySearch () может использоваться только для отсортированных массивов. Вы найдете результат странно ниже. Это лучший вариант, когда массив сортированный.
Пример:
для чего его стоит я провел тест, сравнивая 3 предложения для скорости. Я сгенерировал случайные целые числа, преобразовать их в строку и добавил их в массив. Затем я искал максимально возможное число / строку, что было бы худшим сценарием для asList().содержит.)(
при использовании размера массива 10K результаты где:
при использовании массива 100K результаты где:
Так что если массив создается в отсортированном порядке то двоичный поиск является самым быстрым, в противном случае asList().содержит был бы путь пойти. Если у вас много поисков, то может быть стоит отсортировать массив, чтобы вы могли использовать двоичный поиск. Все зависит от вашего приложения.
Я думаю, что это результаты, которые большинство людей ожидали бы. Вот тестовый код:
вместо того, чтобы использовать синтаксис быстрого инициализации массива, вы можете просто инициализировать его как список сразу же аналогичным образом, используя массивы.метод asList например:
тогда вы можете сделать (как и выше): STRINGS.contains(«the string you want to find»);
С помощью Java 8 вы можете создать поток и проверить, совпадают ли какие-либо записи в потоке «s» :
или как общий метод:
можно использовать массивы класс для выполнения двоичного поиска значения. Если Ваш массив не отсортирован, вам придется использовать функции сортировки в том же классе для сортировки массива, а затем искать по нему.
ObStupidAnswer (но я думаю, что где-то здесь есть урок):
на самом деле, если вы используете HashSet, как предложил том Хотин, вам не нужно беспокоиться о сортировке, и ваша скорость такая же, как и при двоичном поиске по предварительно отсортированному массиву, возможно, даже быстрее.
все зависит от того, как ваш код установлен, но, по-моему, порядок такой:
на Несортированном массиве:
на сортированном массив:
Так или иначе, HashSet ftw
Если у вас есть библиотека Google collections, ответ Тома можно значительно упростить, используя ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
это действительно удаляет много беспорядка из предложенной инициализации
приведенный выше код работает, но нет необходимости конвертировать список, чтобы установить первый. Преобразование списка в набор требует дополнительного времени. Это может так:
первый является более читаемым, чем второй.
In Java 8 использовать потоки.
использование простого цикла является наиболее эффективным способом сделать это.
для массивов ограниченной длины используйте следующее (Как указано camickr). Это медленно для повторных проверок, особенно для более длинных массивов (линейный поиск).
для быстрой работы, если вы неоднократно проверяете против большего набора элементов
массив-это неправильная структура. Используйте TreeSet и добавить каждый элемент в нем. Он сортирует элементы и имеет быстрый exist() способ (двоичный поиск).
если элементы реализации Comparable и вы хотите, чтобы TreeSet отсортированный образом:
ElementClass.compareTo() метод должен быть совместим с ElementClass.equals() : см.триады не появляются, чтобы бороться? (Java Set отсутствует элемент)
в противном случае, используйте свой собственный Comparator :
выплата: проверка существование некоторого элемента:
Java: Проверьте, содержит ли массив значение или элемент
В этом уроке мы рассмотрим примеры того, как проверить, содержит ли массив Java определенный элемент или значение. Мы будем использовать список, потоковый API, а также Apache Commons.
Вступление
Независимо от того, используется ли Java или любой другой язык программирования, проверка того, содержит ли массив значение, является обычным явлением. Это одна из вещей, которой, как правило, учатся большинство новичков, и это полезная вещь, которую нужно знать в целом.
Массивы.asList().содержит()
Это, пожалуй, самый распространенный способ решения этой проблемы, просто потому, что он действительно хорошо работает и прост в реализации.
Массив типа Целое число :
Выполнение этого кода приводит к:
Использование цикла for
Давайте сначала начнем с примитивных целых чисел:
Выполнение этого кода приведет к:
Коллекции.BinarySearch()
Если он не отсортирован, дополнительное время, необходимое для сортировки массива, может сделать этот подход менее выгодным, в зависимости от размера массива и алгоритма сортировки, используемого для его сортировки.
двоичный поиск() имеет множество перегруженных вариантов в зависимости от используемых типов и наших собственных требований, но наиболее общим является:
Где a представляет массив и ключ указанное значение, которое мы ищем.
Теперь возвращаемое значение может немного сбивать с толку, поэтому лучше всего иметь в виду официальную документацию Oracle:
Давайте попробуем это:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Потоковый API Java 8
API потока Java 8 очень универсален и предлагает лаконичные решения для различных задач, связанных с обработкой коллекций объектов. Использование потоков для такого типа задач естественно и интуитивно понятно для большинства.
Давайте посмотрим, как мы можем использовать API потока, чтобы проверить, содержит ли массив целое число:
И для этого используйте строки или пользовательские объекты:
Или вы можете сделать это короче, используя ссылку на метод:
Оба из них будут выводить:
Apache Commons – ArrayUtils
Библиотека Apache Commons предоставляет множество новых интерфейсов, реализаций и классов, которые расширяют базовую платформу Java и присутствуют во многих проектах.
Класс ArrayUtils представляет множество методов для управления массивами, включая метод contains() :
Вывод
Как определить, содержит ли массив определенное значение в Java?
у меня есть String[] со значениями типа так:
27 ответов
предупреждение: это не работает для массивов примитивов (см. комментарии).
С java-8
пример
просто, чтобы очистить код для начала. У нас (исправлено):
это изменчивый статический, который FindBugs скажет вам, очень непослушный. Это должно быть личное:
(обратите внимание, вы можете на самом деле бросить
можно использовать ArrayUtils.contains С Apache Commons Lang
есть методы, доступные для примитивных массивов всех видов.
пример:
Я удивлен, что никто не предложил просто реализовать его по руке:
благоустройство:
Если массив не отсортирован, вам придется перебирать все и вызывать equals для каждого.
Если массив отсортирован, вы можете выполнить двоичный поиск, есть один в массивы класса.
вообще говоря, если вы собираетесь сделать много проверок членства, вы можете сохранить все в наборе, а не в массиве.
1) Использование Списка:
2) Использование Set:
3) используя простой цикл:
4) Использование Массивов.binarySearch ():
приведенный ниже код неверен,он указан здесь для полноты. binarySearch () можно использовать только для отсортированных массивов. Вы найдете результат странно ниже. Это лучший вариант, когда массив сортированный.
Пример:
для чего это стоит, я провел тест, сравнивая 3 предложения для скорости. Я сгенерировал случайные целые числа, преобразовать их в строку и добавил их в массив. Затем я искал максимально возможное число / строку, что было бы наихудшим сценарием для asList().содержит.)(
при использовании размера массива 10K результаты где:
при использовании массива 100K результаты где:
поэтому, если массив создается в отсортированном порядке, двоичный поиск является самым быстрым, иначе asList().contains был бы путь пойти. Если у вас много поисков, то, возможно, стоит отсортировать массив, чтобы вы могли использовать двоичный поиск. Все зависит от вашего заявления.
Я думаю, что это результаты, которые большинство людей ожидали бы. Вот тестовый код:
вместо использования синтаксиса инициализации быстрого массива вы можете просто инициализировать его как список сразу аналогичным образом, используя массивы.метод asList например:
тогда вы можете сделать (как указано выше): STRINGS.contains(«the string you want to find»);
С Java 8 вы можете создать поток и проверить, соответствуют ли какие-либо записи в потоке «s» :
или как общий метод:
можно использовать массивы класс для выполнения двоичного поиска значения. Если Ваш массив не отсортирован, вам придется использовать функции сортировки в том же классе для сортировки массива, а затем выполнить поиск по нему.
ObStupidAnswer (но я думаю, что где-то здесь есть урок):
на самом деле, если вы используете HashSet, как предложил том Хотин, вам не нужно беспокоиться о сортировке, и ваша скорость такая же, как и при двоичном поиске по предустановленному массиву, возможно, даже быстрее.
все зависит от того, как настроен ваш код, очевидно, но с того места, где я стою, порядок будет:
на Несортированном массиве:
на сортированном массив:
Так или иначе, HashSet ftw
Если у вас есть библиотека Google collections, ответ Тома можно упростить, используя ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
Это действительно удаляет много беспорядка из предложенной инициализации
одно из возможных решений:
разработчики часто делают:
приведенный выше код работает, но нет необходимости преобразовывать список для установки в первую очередь. Преобразование списка в набор требует дополнительного времени. Это может так:
первый является более читаемым, чем второй.
на Java 8 использовать потоки.
использование простого цикла является наиболее эффективным способом сделать это.
для массивов ограниченной длины используйте следующее (Как указано camickr). Это медленно для повторных проверок, особенно для более длинных массивов (линейный поиск).
для быстрой производительности, если вы неоднократно проверяете против большего набора элементов
массив является неправильной структурой. Используйте TreeSet и добавьте к нему каждый элемент. Он сортирует элементы и имеет быстрый exist() способ (двоичный поиск).
если элементы реализации Comparable и вы хотите, чтобы TreeSet отсортированный образом:
ElementClass.compareTo() метод должен быть совместим с ElementClass.equals() : см.триады не появляются, чтобы сражаться? (Java Set отсутствует элемент)
в противном случае, используйте свой собственный Comparator :
выплата: проверить существование некоторого элемента:
Как узнать, есть ли элемент в массиве?
4 ответа 4
Используйте метод indexOf
Маленькая интродукция
Задача поиска элемента в массиве стоит перед всеми достаточно часто и хорошо бы расписать, как это можно сделать.
Разберем 6 способов сделать это на нативном JS разной новизны и 3 способа с их разбором на популярных фреймворках: jQuery, underscore и lodash.
Часть первая, нативная, в стиле аллегро
Для начала надо пройтись по родным возможностям языка и посмотреть, что можно сделать самим.
Поиск в лоб
Попробуем просто идти по элементам массива, пока мы не встретим то, что нам нужно. Как всегда самое простое решение является в среднем самым быстрым.
Array.prototype.indexOf()
Array.prototype.lastIndexOf()
Array.prototype.find()
Array.prototype.findIndex()
Array.prototype.includes()
Часть вторая, со вниманием, но чужая и в стиле сонаты
Теперь, наконец, можно поговорить об этой же теме, но в контексте парочки фреймворков! Говорят, что всегда хорошо посмотреть сначала, как делают другие, перед тем, как начнешь делать это сам. Может это откроет нам глаза на что-нибудь интересное!
jQuery
А теперь поговорим, как она работает. Вот, что она представляет из себя в версии 2.1.3 :
Где indexOf это вот это:
Забавный комментарий говорит, что так быстрее, чем родной Array.prototype.indexOf() (могу предположить, что из-за отсутствия всех проверок) и предлагает посмотреть тесты производительности.
Underscore
Lodash
Можно предложить просто обернуть _.indexOf() для поиска элемента:
Заключение, хотя и в стиле интермеццо
И да, все эти варианты имеют смысл, только если момент с поиском данных част в вашем алгоритме или поиск происходит на очень больших данных. Вот приведу ниже несколько тестов на поиск элементов типа Number и String в массивах длинной 1000000 (миллион) элементов для трех случаев, когда элемент находится вначале массива, в середине (можно считать за среднюю по палете ситуацию) и в конце (можно считать за время поиска отсутствующего элемента, кроме метода с Array.prototype.lastIndexOf() ).
Результаты тестов могут сильно зависеть от версии браузера, да и от самих браузеров, как этого избежать не знаю, но рекомендую протестить на нескольких.