Долгий путь, но вы можете использовать цикл for: "for (String s: VALUES) if (s.equals (" MYVALUE ")) вернет true;
Зак
70
@camickr. На ваш вопрос я проголосовал за этот вопрос и ваш ответ - теперь - потому что это сэкономило мне 30 минут и 20 строк кода, безобразно пишущих для циклов, - теперь -. Не читал три года назад. (Кстати, спасибо :))
Преследование
3
@ camickr - у меня почти идентичная ситуация с этим: stackoverflow.com/a/223929/12943 Он просто продолжает получать голоса, но был просто копией / вставкой из документации Sun. Я предполагаю, что оценка основана на том, сколько помощи вы предоставили, а не на том, сколько усилий вы вложили в нее - и в основном на то, насколько быстро вы ее опубликовали! Может быть, мы наткнулись на секрет Джона Скита! Ну, хороший ответ, +1 для вас.
@camickr, потому что люди, как и я, задают вопрос в Google, нажимают на результат SO, видят ваш ответ, проверяют его, он работает, выдает ответ, а затем уходит.
Aequitas
Ответы:
2925
Arrays.asList(yourArray).contains(yourValue)
Предупреждение: это не работает для массивов примитивов (см. Комментарии).
поскольку Java-8 Теперь вы можете использовать потоки.
Мне несколько любопытно, как это можно сравнить с функциями поиска в классе Arrays, с итерациями по массиву и использованием функции equals () или == для примитивов.
Томас Оуэнс
186
Вы не теряете много, так как asList () возвращает ArrayList, в основе которого лежит массив. Конструктор просто изменит ссылку, так что там не так много работы. И содержит () / indexOf () будет повторять и использовать equals (). Для примитивов вам лучше кодировать его самостоятельно. Для строк или других классов разница не будет заметна.
Джои
18
Странно, NetBeans утверждает, что Arrays.asList (праздничные дни) для int [] праздничных дней возвращает «список <int []>», а не «список <int>». Он содержит только один элемент. Значение Contains не работает, поскольку в нем только один элемент; массив int.
Nyerguds
62
Nyerguds: действительно, это не работает для примитивов. В Java примитивные типы не могут быть универсальными. asList объявлен как <T> список <T> asList (T ...). Когда вы передаете в него int [], компилятор выводит T = int [], потому что он не может вывести T = int, потому что примитивы не могут быть универсальными.
CromTheDestroyer
28
@Joey просто примечание стороны, что это ArrayList, но не java.util.ArrayListтак , как ожидалось, реальный класс возвращаемый: java.util.Arrays.ArrayList<E>определяется как: public class java.util.Arrays {private static class ArrayList<E> ... {}}.
TWiStErRob
363
Краткое обновление для Java SE 9
Ссылочные массивы плохие. Для этого случая мы после набора. Начиная с Java SE 9 у нас есть Set.of.
Это изменчивая статика, которую FindBugs скажет вам очень капризная. Не изменяйте статику и не позволяйте другому коду делать это тоже. Как минимум, поле должно быть приватным:
(Параноидальные люди, такие как я, могут чувствовать себя более непринужденно, если их обернуть Collections.unmodifiableSet- тогда их даже можно будет обнародовать.)
(* Чтобы немного больше узнать о бренде, API коллекций, по-видимому, все еще не содержит неизменяемые типы коллекций, а синтаксис все еще слишком многословен, на мой вкус.)
За исключением того, что это O (N), чтобы создать коллекцию в первую очередь :)
Drew Noakes
61
Если он статичен, он, вероятно, будет использоваться довольно много раз. Таким образом, время, затрачиваемое на инициализацию набора, имеет хорошие шансы быть достаточно маленьким по сравнению со стоимостью многих линейных поисков.
Xr.
1
При создании коллекции будет доминировать время загрузки кода (которое технически равно O (n), но практически постоянно).
Том Хотин - tackline
2
@ TomHawtin-tackline Почему вы говорите «в частности, здесь мы хотим, чтобы набор»? В чем преимущество набора (HashSet) в этом случае? Почему «ссылочный массив» плох (под «ссылочным массивом» подразумевается ArrayList, поддерживаемый массивом, сгенерированным вызовом Arrays.asList)?
Василий Бурк
6
@nmr А TreeSetбудет O(log n). HashSets масштабируются таким образом, чтобы среднее количество элементов в корзине было примерно постоянным. По крайней мере, для массивов до 2 ^ 30. Скажем, могут быть эффекты от, скажем, аппаратных кешей, которые анализ big-O игнорирует. Также предполагается, что хэш-функция работает эффективно.
@ max4ever Иногда эта библиотека уже включена (по другим причинам), и это вполне верный ответ. Я искал это и уже зависел от Apache Commons Lang. Спасибо за этот ответ.
GuiSim
1
Или вы можете просто скопировать метод (и зависимости, если таковые имеются).
Буффало
10
@ max4ever Proguard минимизирует большинство приложений для Android, добавляя в приложение только те классы и функции, которые вам нужны. Это равносильно тому, чтобы свернуть свой собственный или скопировать источник информации об Apache. И тот, кто не использует эту минимализацию, не должен жаловаться на 700 КБ или 78 КБ :)
Kenyakorn Ketsombut
158
Просто выполните это вручную:
publicstatic<T>boolean contains(final T[] array,final T v){for(final T e : array)if(e == v || v !=null&& v.equals(e))returntrue;returnfalse;}
Улучшение:
v != nullУсловие является постоянным внутри метода. Он всегда вычисляет одно и то же логическое значение во время вызова метода. Поэтому, если входное значение arrayвелико, более эффективно оценить это условие только один раз, и мы можем использовать упрощенное / более быстрое условие внутри forцикла на основе результата. Улучшенный contains()метод:
publicstatic<T>boolean contains2(final T[] array,final T v){if(v ==null){for(final T e : array)if(e ==null)returntrue;}else{for(final T e : array)if(e == v || v.equals(e))returntrue;}returnfalse;}
@Phoexo Это решение, очевидно, быстрее, потому что принятый ответ оборачивает массив в список и вызывает метод contains () в этом списке, в то время как мое решение в основном делает то, что будет делать только only ().
icza
10
@AlastorMoody e == v очень быстро проверяет равенство ссылок. Если тот же объект (тот же самый по ссылке) находится в массиве, он будет найден быстрее. Если это не тот же экземпляр, он все равно может быть таким же, как заявлено методом equals (), это то, что проверяется, если ссылки не совпадают.
icza
20
Почему эта функция не является частью Java? Неудивительно, что люди говорят, что Java раздутая ... посмотрите на все ответы выше, которые используют множество библиотек, когда все, что вам нужно, это цикл for. Дети в эти дни!
phreakhead
4
@phreakhead Это часть Java, см.Collection.contains(Object)
Стив Куо
11
@icza Если вы посмотрите на источник, Arraysи ArrayListоказывается, что это не обязательно быстрее, чем версия, используемая Arrays.asList(...).contains(...). Затраты на создание ArrayListчрезвычайно малы и ArrayList.contains()используют более умный цикл (фактически он использует два разных цикла), чем показанный выше (JDK 7).
Код ниже неверен, он указан здесь для полноты. Функция binarySearch () может использоваться ТОЛЬКО на отсортированных массивах. Вы найдете результат странный ниже. Это лучший вариант, когда массив отсортирован.
publicstaticboolean binarySearch(String[] arr,String targetValue){int a =Arrays.binarySearch(arr, targetValue);return a >0;}
Почему? Я думаю, что он должен возвращать> -1, так как 0 будет означать, что он содержится в начале массива.
до
1
Первый вариант с (a >= 0)был правильным, просто проверьте документы , они говорят: «Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0, если и только если ключ найден».
Йори Н.
Почему работает с String, а не с int? статическое логическое значение существует (int [] ints, int k) {return Arrays.asList (ints) .contains (k); }
Виллианс Мартинс
71
Если массив не отсортирован, вам придется перебирать все и вызывать равные для каждого.
Если массив отсортирован, вы можете выполнить бинарный поиск, он есть в классе Arrays .
Вообще говоря, если вы собираетесь делать много проверок членства, вы можете хранить все в наборе, а не в массиве.
Кроме того, как я сказал в своем ответе, если вы используете класс Arrays, вы можете отсортировать массив, а затем выполнить бинарный поиск по вновь отсортированному массиву.
Томас Оуэнс
1
@ Томас: я согласен. Или вы можете просто добавить все в TreeSet; такая же сложность. Я бы использовал массивы, если они не меняются (возможно, сохраните немного локальности памяти, так как ссылки расположены непрерывно, а строки - нет). Я бы использовал набор, если это изменится со временем.
Ури
49
Для чего это я запустил тест, сравнивая 3 предложения по скорости. Я сгенерировал случайные целые числа, преобразовал их в строку и добавил их в массив. Затем я искал максимально возможное число / строку, что было бы наихудшим сценарием для asList().contains().
При использовании размера массива 10K были получены следующие результаты:
Сортировка и поиск: 15
Двоичный поиск: 0
asList.contains: 0
При использовании массива 100K были получены следующие результаты:
Сортировка и поиск: 156
Двоичный поиск: 0
asList.contains: 32
Таким образом, если массив создается в отсортированном порядке, бинарный поиск будет самым быстрым, в противном случае это asList().containsбудет путь. Если у вас много поисков, то, возможно, стоит отсортировать массив, чтобы вы могли использовать бинарный поиск. Все зависит от вашего приложения.
Я думаю, что это те результаты, которых ожидает большинство людей. Вот тестовый код:
Я не понимаю этот код. Вы сортируете массив 'strings' и используете один и тот же (отсортированный) массив в обоих вызовах binarySearch. Как это может показать что-нибудь кроме оптимизации времени выполнения HotSpot? То же самое с вызовом asList.contains. Вы создаете список из отсортированного массива, а затем содержит в нем самое высокое значение. Конечно, это займет время. В чем смысл этого теста? Не говоря уже о неправильно написанном микробенчмарке
Эрик
Кроме того, поскольку бинарный поиск может применяться только к отсортированному набору, сортировка и поиск являются единственным возможным способом использования бинарного поиска.
Эрик
Сортировка может быть уже выполнена по ряду других причин, например, она может быть отсортирована по init и никогда не изменяться. Там есть использование в тестировании времени поиска самостоятельно. Тем не менее, где это падает, это не просто звездный пример микробенчмаркинга. Общеизвестно, что микробенчмарки сложно получить в Java, и они должны, например, включать выполнение тестового кода, достаточного для оптимизации горячей точки перед запуском реального теста, не говоря уже о запуске реального тестового кода больше, чем ONCE с таймером. Пример ловушек
Thor84no
7
Этот тест некорректен, поскольку он запускает все 3 теста в одном экземпляре JVM. Более поздние тесты могут выиграть от более ранних прогревов кеша, JIT и т. Д.
Steve Kuo
4
Этот тест на самом деле совершенно не связан. Сортировка и поиск имеют линейную (n * log (n)) сложность, двоичный поиск - логарифмический, а ArrayUtils.contains - линейный. Бесполезно сравнивать эти решения, поскольку они находятся в совершенно разных классах сложности.
Драг
37
Вместо того, чтобы использовать синтаксис быстрой инициализации массива, вы можете просто инициализировать его в виде списка List сразу же, используя метод Arrays.asList, например:
Кроме того, anyMatchJavaDoc заявляет, что это "...May not evaluate the predicate on all elements if not necessary for determining the result."так, поэтому может не потребоваться продолжать обработку после нахождения соответствия.
mkobit 15.12.14
28
Вы можете использовать класс Arrays для выполнения двоичного поиска значения. Если ваш массив не отсортирован, вам придется использовать функции сортировки в том же классе, чтобы отсортировать массив, а затем выполнить поиск по нему.
Вы можете использовать функции сортировки в том же классе, чтобы сделать это ... Я должен добавить это к моему ответу.
Томас Оуэнс
1
Наверное, будет стоить дороже, чем подход asList (). Contains (). Если вам не нужно делать эту проверку очень часто (но если это просто статический список значений, которые можно отсортировать для начала, если честно).
Джои
Правда. Есть много переменных, которые будут наиболее эффективными. Хотя хорошо иметь варианты.
Сортировка целого массива с целью поиска обходится дорого. Мы можем использовать то же время процессора для самого поиска лайнера. Я предпочитаю бинарный поиск по коллекции, которая заранее составлена в отсортированном порядке.
arunwithasmile
17
ObStupidAnswer (но я думаю, что где-то здесь есть урок):
Бросок исключений, по-видимому, тяжел, но это был бы новый способ проверки значения, если он работает. Недостатком является то, что перечисление должно быть определено заранее.
Джеймс П.
13
На самом деле, если вы используете HashSet <String>, как предложил Том Хоутин, вам не нужно беспокоиться о сортировке, и ваша скорость такая же, как при бинарном поиске в предварительно отсортированном массиве, возможно, даже быстрее.
Очевидно, все зависит от того, как настроен ваш код, но с того места, где я стою, порядок будет следующим:
Членство в HashSet должно быть O (1), а двоичный поиск в отсортированной коллекции - O (log n).
Skylar Saveland
11
Если у вас есть библиотека коллекций Google, ответ Тома может быть значительно упрощен с помощью ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
Это действительно удаляет много беспорядка из предложенной инициализации
Set<String> set =newHashSet<String>(Arrays.asList(arr));return set.contains(targetValue);
Приведенный выше код работает, но нет необходимости преобразовывать список для установки в первую очередь. Преобразование списка в набор требует дополнительного времени. Это может быть так просто, как:
Для массивов ограниченной длины используйте следующее (как указано в camickr ). Это медленно для повторных проверок, особенно для более длинных массивов (линейный поиск).
Arrays.asList(...).contains(...)
Для быстрой производительности, если вы неоднократно проверяете по большому набору элементов
Массив - это неправильная структура. Используйте TreeSetи добавьте каждый элемент к нему. Он сортирует элементы и имеет быстрый exist()метод (бинарный поиск).
Если элементы реализуют Comparable& вы хотите TreeSetотсортировать соответственно:
TreeSet myElements =newTreeSet();// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);// *Alternatively*, if an array is forceably provided from other code:
myElements.addAll(Arrays.asList(myArray));
В противном случае используйте свои собственные Comparator:
classMyComparatorimplementsComparator<ElementClass>{int compareTo(ElementClass element1;ElementClass element2){// Your comparison of elements// Should be consistent with object equality}boolean equals(Object otherComparator){// Your equality of comparators}}// construct TreeSet with the comparatorTreeSet myElements =newTreeSet(newMyComparator());// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
Выплата: проверьте наличие некоторого элемента:
// Fast binary search through sorted elements (performance ~ log(size)):boolean containsElement = myElements.exists(someElement);
Зачем TreeSet? HashSetбыстрее (O (1)) и не требует упорядочения.
Шон Оуэн
4
Попробуй это:
ArrayList<Integer> arrlist =newArrayList<Integer>(8);// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);boolean retval = arrlist.contains(10);if(retval ==true){System.out.println("10 is contained in the list");}else{System.out.println("10 is not contained in the list");}
Используйте следующее ( contains()методArrayUtils.in() в этом коде):
ObjectUtils.java
publicclassObjectUtils{/**
* A null safe method to detect if two objects are equal.
* @param object1
* @param object2
* @return true if either both objects are null, or equal, else returns false.
*/publicstaticboolean equals(Object object1,Object object2){return object1==null? object2==null: object1.equals(object2);}}
ArrayUtils.java
publicclassArrayUtils{/**
* Find the index of of an object is in given array, starting from given inclusive index.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @param start The index from where the search must start.
* @return Index of the given object in the array if it is there, else -1.
*/publicstatic<T>int indexOf(final T[] ts,final T t,int start){for(int i = start; i < ts.length;++i)if(ObjectUtils.equals(ts[i], t))return i;return-1;}/**
* Find the index of of an object is in given array, starting from 0;
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return indexOf(ts, t, 0)
*/publicstatic<T>int indexOf(final T[] ts,final T t){return indexOf(ts, t,0);}/**
* Detect if the given object is in the given array.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return If indexOf(ts, t) is greater than -1.
*/publicstatic<T>boolean in(final T[] ts,final T t){return indexOf(ts, t)>-1;}}
Как вы можете видеть в приведенном выше коде, что существуют и другие методы полезности ObjectUtils.equals()и ArrayUtils.indexOf(), которые были использованы в других местах.
Я очень поздно присоединяюсь к этой дискуссии, но, поскольку мой подход к решению этой проблемы, когда я столкнулся с ней несколько лет назад, несколько отличался от других ответов, уже опубликованных здесь, я публикую то решение, которое я использовал в то время, здесь, на случай, если кто-нибудь найдет это полезным.
Абхишек Оза
3
Проверь это
String[] VALUES =newString[]{"AB","BC","CD","AE"};String s;for(int i=0; i< VALUES.length ; i++){if( VALUES[i].equals(s)){// do your stuff}else{//do your stuff}}
Это не работает - он будет вводить elseдля каждого элемента, который не соответствует (поэтому, если вы ищете «AB» в этом массиве, он будет идти туда 3 раза, так как 3 значения не являются «AB» «).
Бернхард Баркер
3
Arrays.asList () -> тогда вызов метода contains () всегда будет работать, но алгоритм поиска намного лучше, так как вам не нужно создавать облегченную оболочку списка вокруг массива, что делает Arrays.asList () ,
publicboolean findString(String[] strings,String desired){for(String str : strings){if(desired.equals(str)){returntrue;}}returnfalse;//if we get here… there is no desired String, return false.}
Array.BinarySearchи Array.FindIndexявляются методами .NET и не существуют в Java.
Атайлор
@ataylor В Java есть Arrays.binarySearch. Но вы правы, не Arrays.findIndex
Мент
Следует отметить:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
Дориан Грей
1
Создайте логическое значение, изначально установленное в false. Запустите цикл, чтобы проверить каждое значение в массиве и сравнить со значением, которое вы проверяете. Если вы когда-нибудь получите совпадение, установите логическое значение в true и остановите цикл. Тогда утверждают, что логическое значение истинно.
Поскольку я имею дело с низкоуровневой Java, использующей примитивные типы byte и byte [], лучшее, что я получил на данный момент, - это bytes-java https://github.com/patrickfav/bytes-java, что кажется хорошей работой.
Ответы:
Предупреждение: это не работает для массивов примитивов (см. Комментарии).
поскольку Java-8 Теперь вы можете использовать потоки.
Чтобы проверить массив ли
int
,double
илиlong
содержит использование значенийIntStream
,DoubleStream
илиLongStream
соответственно.пример
источник
ArrayList
, но неjava.util.ArrayList
так , как ожидалось, реальный класс возвращаемый:java.util.Arrays.ArrayList<E>
определяется как:public class java.util.Arrays {private static class ArrayList<E> ... {}}
.Краткое обновление для Java SE 9
Ссылочные массивы плохие. Для этого случая мы после набора. Начиная с Java SE 9 у нас есть
Set.of
.«Учитывая строку s, есть ли хороший способ проверить, содержит ли VALUES s?»
O (1).
Правильный тип , неизменен , O (1) и краткое . Прекрасный.*
Оригинальные детали ответа
Просто чтобы очистить код для начала. Мы (исправили):
Это изменчивая статика, которую FindBugs скажет вам очень капризная. Не изменяйте статику и не позволяйте другому коду делать это тоже. Как минимум, поле должно быть приватным:
(Обратите внимание, вы можете на самом деле отбросить
new String[];
бит.)Ссылочные массивы все еще плохи, и мы хотим установить:
(Параноидальные люди, такие как я, могут чувствовать себя более непринужденно, если их обернуть
Collections.unmodifiableSet
- тогда их даже можно будет обнародовать.)(* Чтобы немного больше узнать о бренде, API коллекций, по-видимому, все еще не содержит неизменяемые типы коллекций, а синтаксис все еще слишком многословен, на мой вкус.)
источник
Arrays.asList
)?TreeSet
будетO(log n)
.HashSet
s масштабируются таким образом, чтобы среднее количество элементов в корзине было примерно постоянным. По крайней мере, для массивов до 2 ^ 30. Скажем, могут быть эффекты от, скажем, аппаратных кешей, которые анализ big-O игнорирует. Также предполагается, что хэш-функция работает эффективно.Вы можете использовать
ArrayUtils.contains
от Apache Commons Langpublic static boolean contains(Object[] array, Object objectToFind)
Обратите внимание, что этот метод возвращает,
false
если передан массивnull
.Есть также методы, доступные для примитивных массивов всех видов.
Пример:
источник
Просто выполните это вручную:
Улучшение:
v != null
Условие является постоянным внутри метода. Он всегда вычисляет одно и то же логическое значение во время вызова метода. Поэтому, если входное значениеarray
велико, более эффективно оценить это условие только один раз, и мы можем использовать упрощенное / более быстрое условие внутриfor
цикла на основе результата. Улучшенныйcontains()
метод:источник
Collection.contains(Object)
Arrays
иArrayList
оказывается, что это не обязательно быстрее, чем версия, используемаяArrays.asList(...).contains(...)
. Затраты на созданиеArrayList
чрезвычайно малы иArrayList.contains()
используют более умный цикл (фактически он использует два разных цикла), чем показанный выше (JDK 7).Четыре различных способа проверить, содержит ли массив значение
1) Использование списка:
2) Используя Set:
3) Используя простой цикл:
4) Использование Arrays.binarySearch ():
Код ниже неверен, он указан здесь для полноты. Функция binarySearch () может использоваться ТОЛЬКО на отсортированных массивах. Вы найдете результат странный ниже. Это лучший вариант, когда массив отсортирован.
Быстрый пример:
источник
(a >= 0)
был правильным, просто проверьте документы , они говорят: «Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0, если и только если ключ найден».Если массив не отсортирован, вам придется перебирать все и вызывать равные для каждого.
Если массив отсортирован, вы можете выполнить бинарный поиск, он есть в классе Arrays .
Вообще говоря, если вы собираетесь делать много проверок членства, вы можете хранить все в наборе, а не в массиве.
источник
Для чего это я запустил тест, сравнивая 3 предложения по скорости. Я сгенерировал случайные целые числа, преобразовал их в строку и добавил их в массив. Затем я искал максимально возможное число / строку, что было бы наихудшим сценарием для
asList().contains()
.При использовании размера массива 10K были получены следующие результаты:
При использовании массива 100K были получены следующие результаты:
Таким образом, если массив создается в отсортированном порядке, бинарный поиск будет самым быстрым, в противном случае это
asList().contains
будет путь. Если у вас много поисков, то, возможно, стоит отсортировать массив, чтобы вы могли использовать бинарный поиск. Все зависит от вашего приложения.Я думаю, что это те результаты, которых ожидает большинство людей. Вот тестовый код:
источник
Вместо того, чтобы использовать синтаксис быстрой инициализации массива, вы можете просто инициализировать его в виде списка List сразу же, используя метод Arrays.asList, например:
Тогда вы можете сделать (как выше):
источник
С Java 8 вы можете создать поток и проверить, совпадают ли какие-либо записи в потоке
"s"
:Или как универсальный метод:
источник
anyMatch
JavaDoc заявляет, что это"...May not evaluate the predicate on all elements if not necessary for determining the result."
так, поэтому может не потребоваться продолжать обработку после нахождения соответствия.Вы можете использовать класс Arrays для выполнения двоичного поиска значения. Если ваш массив не отсортирован, вам придется использовать функции сортировки в том же классе, чтобы отсортировать массив, а затем выполнить поиск по нему.
источник
ObStupidAnswer (но я думаю, что где-то здесь есть урок):
источник
На самом деле, если вы используете HashSet <String>, как предложил Том Хоутин, вам не нужно беспокоиться о сортировке, и ваша скорость такая же, как при бинарном поиске в предварительно отсортированном массиве, возможно, даже быстрее.
Очевидно, все зависит от того, как настроен ваш код, но с того места, где я стою, порядок будет следующим:
На несортированном массиве:
В отсортированном массиве:
Так или иначе, HashSet для победы.
источник
Если у вас есть библиотека коллекций Google, ответ Тома может быть значительно упрощен с помощью ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
Это действительно удаляет много беспорядка из предложенной инициализации
источник
Одно из возможных решений:
источник
Разработчики часто делают:
Приведенный выше код работает, но нет необходимости преобразовывать список для установки в первую очередь. Преобразование списка в набор требует дополнительного времени. Это может быть так просто, как:
или
Первый более читабелен, чем второй.
источник
Использование простого цикла является наиболее эффективным способом сделать это.
Предоставлено Programcreek
источник
В Java 8 используйте Streams.
источник
Для массивов ограниченной длины используйте следующее (как указано в camickr ). Это медленно для повторных проверок, особенно для более длинных массивов (линейный поиск).
Для быстрой производительности, если вы неоднократно проверяете по большому набору элементов
Массив - это неправильная структура. Используйте
TreeSet
и добавьте каждый элемент к нему. Он сортирует элементы и имеет быстрыйexist()
метод (бинарный поиск).Если элементы реализуют
Comparable
& вы хотитеTreeSet
отсортировать соответственно:ElementClass.compareTo()
Метод должен быть совместим сElementClass.equals()
: см. Триады не появляются, чтобы бороться? (Java Set отсутствует элемент)В противном случае используйте свои собственные
Comparator
:Выплата: проверьте наличие некоторого элемента:
источник
TreeSet
?HashSet
быстрее (O (1)) и не требует упорядочения.Попробуй это:
источник
Используйте следующее (
contains()
методArrayUtils.in()
в этом коде):ObjectUtils.java
ArrayUtils.java
Как вы можете видеть в приведенном выше коде, что существуют и другие методы полезности
ObjectUtils.equals()
иArrayUtils.indexOf()
, которые были использованы в других местах.источник
Проверь это
источник
else
для каждого элемента, который не соответствует (поэтому, если вы ищете «AB» в этом массиве, он будет идти туда 3 раза, так как 3 значения не являются «AB» «).Arrays.asList () -> тогда вызов метода contains () всегда будет работать, но алгоритм поиска намного лучше, так как вам не нужно создавать облегченную оболочку списка вокруг массива, что делает Arrays.asList () ,
источник
Arrays.asList
это не O (n). Это просто легкая обертка. Посмотрите на реализацию.Если вы не хотите, чтобы он был чувствительным к регистру
источник
использование
Array.BinarySearch(array,obj)
для нахождения данного объекта в массиве или нет.Пример:
ложь - не существует
источник
Array.BinarySearch
иArray.FindIndex
являются методами .NET и не существуют в Java.The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
Создайте логическое значение, изначально установленное в false. Запустите цикл, чтобы проверить каждое значение в массиве и сравнить со значением, которое вы проверяете. Если вы когда-нибудь получите совпадение, установите логическое значение в true и остановите цикл. Тогда утверждают, что логическое значение истинно.
источник
Попробуйте использовать метод теста предикатов Java 8
Вот полный пример этого.
http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html
https://github.com/VipulGulhane1/java8/blob/master/Test.java
источник
использование
Spliterator
предотвращает ненужную генерациюList
found == true
еслиsearch
содержится в массивеэто делает работу для массивов примитивов
источник
Поскольку я имею дело с низкоуровневой Java, использующей примитивные типы byte и byte [], лучшее, что я получил на данный момент, - это bytes-java https://github.com/patrickfav/bytes-java, что кажется хорошей работой.
источник
Вы можете проверить это двумя способами
A) Путем преобразования массива в строку и проверки необходимой строки методом .contains
Б) это более эффективный метод
источник