Java поиск значения в массиве

у меня есть String[] со значениями типа так:

дано String s , есть ли хороший способ проверить, есть ли VALUES содержит s ?

27 ответов

предупреждение: это не работает для массивов примитивов (см. комментарии).

С java-8

теперь вы можете использовать Stream чтобы проверить, является ли массив int , double или long содержит значение (соответственно, используя IntStream , DoubleStream или LongStream )

пример

просто, чтобы очистить код для начала. У нас (исправлено):

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

(обратите внимание, вы можете на самом деле бросить

можно использовать ArrayUtils.contains С Apache Commons Lang

обратите внимание, что этот метод возвращает false Если переданный массив null .

есть методы, доступные для примитивных массивов всех видов.

пример:

Я удивлен, что никто не предложил просто реализовать его по руке:

благоустройство:

на v != null условие является постоянным внутри метода, оно всегда вычисляет одно и то же логическое значение во время вызова метода. Поэтому, если вход array большой, более эффективно оценивать это условие только один раз, и мы можем использовать упрощенное/более быстрое условие внутри for цикл на основе результата. Улучшенное contains() метод:

Если массив не отсортирован, вам придется перебирать все и вызывать 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, как предложил том Хотин, вам не нужно беспокоиться о сортировке, и ваша скорость такая же, как и при двоичном поиске по предустановленному массиву, возможно, даже быстрее.

все зависит от того, как настроен ваш код, очевидно, но с того места, где я стою, порядок будет:

на Несортированном массиве:

  1. поиска HashSet
  2. asList
  3. сортировка и двоичный

на сортированном массив:

Так или иначе, 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 :

выплата: проверить существование некоторого элемента:

массивы.asList () — > тогда вызов метода contains () всегда будет работать, но алгоритм поиска намного лучше, так как вам не нужно создавать легкую оболочку списка вокруг массива, что и является массивами.asList() делает.

Не подскажете есть ли метод по поиску элементов в массиве? P.S поиск будет проводиться в массиве элементов с типом char

3 ответа 3

Преобразуйте массив к списку и вызовите indexOf() у списка

А если массив отсортированный, то лучше вызвать Arrays.binarySearch()

Увы ничего стандартного в java нет, приходится писать свои велосипеды:

Как вариант, можно воспользоваться библиотекой Apache Commons Lang, там есть утилитный класс ArrayUtils с методом indexOf

В этой статье мы напишем простую програму для поиска определенного элемента в массиве чисел. Код программы представлен на Java.

Поиск элемента в массиве. Программа на Java

Линейный или последовательный поиск является простейшим способом найти элемент в массиве чисел. Поиск происходит поочередным сравнением элементом всего массива.

Ниже представлена Java программа поиска элементов в массиве простым перебором:


[an error occurred while processing the directive]
Карта сайта