Как определить, содержит ли массив определенное значение в Java?

2279

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

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

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

Майк Сиклер
источник
5
Долгий путь, но вы можете использовать цикл for: "for (String s: VALUES) if (s.equals (" MYVALUE ")) вернет true;
Зак
70
@camickr. На ваш вопрос я проголосовал за этот вопрос и ваш ответ - теперь - потому что это сэкономило мне 30 минут и 20 строк кода, безобразно пишущих для циклов, - теперь -. Не читал три года назад. (Кстати, спасибо :))
Преследование
3
@ camickr - у меня почти идентичная ситуация с этим: stackoverflow.com/a/223929/12943 Он просто продолжает получать голоса, но был просто копией / вставкой из документации Sun. Я предполагаю, что оценка основана на том, сколько помощи вы предоставили, а не на том, сколько усилий вы вложили в нее - и в основном на то, насколько быстро вы ее опубликовали! Может быть, мы наткнулись на секрет Джона Скита! Ну, хороший ответ, +1 для вас.
Билл К
1
Если вы используете Apache Commons, то org.apache.commons.lang.ArrayUtils.contains () сделает это за вас.
Мистер Бой
34
@camickr, потому что люди, как и я, задают вопрос в Google, нажимают на результат SO, видят ваш ответ, проверяют его, он работает, выдает ответ, а затем уходит.
Aequitas

Ответы:

2925
Arrays.asList(yourArray).contains(yourValue)

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


поскольку Теперь вы можете использовать потоки.

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

Чтобы проверить массив ли int, doubleили longсодержит использование значений IntStream, DoubleStreamили LongStreamсоответственно.

пример

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
camickr
источник
87
Мне несколько любопытно, как это можно сравнить с функциями поиска в классе 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.

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

«Учитывая строку s, есть ли хороший способ проверить, содержит ли VALUES s?»

VALUES.contains(s)

O (1).

Правильный тип , неизменен , O (1) и краткое . Прекрасный.*

Оригинальные детали ответа

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

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

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

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(Обратите внимание, вы можете на самом деле отбросить new String[];бит.)

Ссылочные массивы все еще плохи, и мы хотим установить:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(Параноидальные люди, такие как я, могут чувствовать себя более непринужденно, если их обернуть Collections.unmodifiableSet- тогда их даже можно будет обнародовать.)

(* Чтобы немного больше узнать о бренде, API коллекций, по-видимому, все еще не содержит неизменяемые типы коллекций, а синтаксис все еще слишком многословен, на мой вкус.)

Том Хотин - Tackline
источник
184
За исключением того, что это 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 игнорирует. Также предполагается, что хэш-функция работает эффективно.
Том Хотин - tackline
206

Вы можете использовать ArrayUtils.containsот Apache Commons Lang

public static boolean contains(Object[] array, Object objectToFind)

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

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

Пример:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}
Intracer
источник
4
@ max4ever Я согласен, но это все же лучше, чем «сворачивать свои», и легче читать, чем сырой Java-способ.
Джейсон
2
пакет: org.apache.commons.lang.ArrayUtils
slamborne
38
@ max4ever Иногда эта библиотека уже включена (по другим причинам), и это вполне верный ответ. Я искал это и уже зависел от Apache Commons Lang. Спасибо за этот ответ.
GuiSim
1
Или вы можете просто скопировать метод (и зависимости, если таковые имеются).
Буффало
10
@ max4ever Proguard минимизирует большинство приложений для Android, добавляя в приложение только те классы и функции, которые вам нужны. Это равносильно тому, чтобы свернуть свой собственный или скопировать источник информации об Apache. И тот, кто не использует эту минимализацию, не должен жаловаться на 700 КБ или 78 КБ :)
Kenyakorn Ketsombut
158

Просто выполните это вручную:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Улучшение:

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

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}
icza
источник
9
@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).
Аксель
72

Четыре различных способа проверить, содержит ли массив значение

1) Использование списка:

public static boolean useList(String[] arr, String targetValue) {
    return Arrays.asList(arr).contains(targetValue);
}

2) Используя Set:

public static boolean useSet(String[] arr, String targetValue) {
    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.contains(targetValue);
}

3) Используя простой цикл:

public static boolean useLoop(String[] arr, String targetValue) {
    for (String s: arr) {
        if (s.equals(targetValue))
            return true;
    }
    return false;
}

4) Использование Arrays.binarySearch ():

Код ниже неверен, он указан здесь для полноты. Функция binarySearch () может использоваться ТОЛЬКО на отсортированных массивах. Вы найдете результат странный ниже. Это лучший вариант, когда массив отсортирован.

public static boolean binarySearch(String[] arr, String targetValue) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 0;
        }

Быстрый пример:

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false
Сириш Ярлагадда
источник
5
ваш пример двоичного поиска должен возвращать> 0;
Уилл Шервуд
6
Почему? Я думаю, что он должен возвращать> -1, так как 0 будет означать, что он содержится в начале массива.
до
1
Первый вариант с (a >= 0)был правильным, просто проверьте документы , они говорят: «Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0, если и только если ключ найден».
Йори Н.
Почему работает с String, а не с int? статическое логическое значение существует (int [] ints, int k) {return Arrays.asList (ints) .contains (k); }
Виллианс Мартинс
71

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

Если массив отсортирован, вы можете выполнить бинарный поиск, он есть в классе Arrays .

Вообще говоря, если вы собираетесь делать много проверок членства, вы можете хранить все в наборе, а не в массиве.

Uri
источник
1
Кроме того, как я сказал в своем ответе, если вы используете класс Arrays, вы можете отсортировать массив, а затем выполнить бинарный поиск по вновь отсортированному массиву.
Томас Оуэнс
1
@ Томас: я согласен. Или вы можете просто добавить все в TreeSet; такая же сложность. Я бы использовал массивы, если они не меняются (возможно, сохраните немного локальности памяти, так как ссылки расположены непрерывно, а строки - нет). Я бы использовал набор, если это изменится со временем.
Ури
49

Для чего это я запустил тест, сравнивая 3 предложения по скорости. Я сгенерировал случайные целые числа, преобразовал их в строку и добавил их в массив. Затем я искал максимально возможное число / строку, что было бы наихудшим сценарием для asList().contains().

При использовании размера массива 10K были получены следующие результаты:

Сортировка и поиск: 15
Двоичный поиск: 0
asList.contains: 0

При использовании массива 100K были получены следующие результаты:

Сортировка и поиск: 156
Двоичный поиск: 0
asList.contains: 32

Таким образом, если массив создается в отсортированном порядке, бинарный поиск будет самым быстрым, в противном случае это asList().containsбудет путь. Если у вас много поисков, то, возможно, стоит отсортировать массив, чтобы вы могли использовать бинарный поиск. Все зависит от вашего приложения.

Я думаю, что это те результаты, которых ожидает большинство людей. Вот тестовый код:

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}
camickr
источник
6
Я не понимаю этот код. Вы сортируете массив '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, например:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

Тогда вы можете сделать (как выше):

STRINGS.contains("the string you want to find");
Марк Родос
источник
36

С Java 8 вы можете создать поток и проверить, совпадают ли какие-либо записи в потоке "s":

String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);

Или как универсальный метод:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}
assylias
источник
3
Стоит также отметить примитивные специализации.
Скиви
Кроме того, 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 (). Если вам не нужно делать эту проверку очень часто (но если это просто статический список значений, которые можно отсортировать для начала, если честно).
Джои
Правда. Есть много переменных, которые будут наиболее эффективными. Хотя хорошо иметь варианты.
Томас Оуэнс
Некоторый код, который делает это здесь: stackoverflow.com/a/48242328/9131078
OOBalance
Сортировка целого массива с целью поиска обходится дорого. Мы можем использовать то же время процессора для самого поиска лайнера. Я предпочитаю бинарный поиск по коллекции, которая заранее составлена ​​в отсортированном порядке.
arunwithasmile
17

ObStupidAnswer (но я думаю, что где-то здесь есть урок):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}
Том Хотин - Tackline
источник
1
Бросок исключений, по-видимому, тяжел, но это был бы новый способ проверки значения, если он работает. Недостатком является то, что перечисление должно быть определено заранее.
Джеймс П.
13

На самом деле, если вы используете HashSet <String>, как предложил Том Хоутин, вам не нужно беспокоиться о сортировке, и ваша скорость такая же, как при бинарном поиске в предварительно отсортированном массиве, возможно, даже быстрее.

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

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

  1. HashSet
  2. asList
  3. сортировать и двоичные

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

  1. HashSet
  2. двоичный
  3. asList

Так или иначе, HashSet для победы.

не
источник
2
Членство в 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)

Это действительно удаляет много беспорядка из предложенной инициализации

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");
jhodges
источник
10

Одно из возможных решений:

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}
Кристиан Хименес
источник
8

Разработчики часто делают:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

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

Arrays.asList(arr).contains(targetValue);

или

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

Первый более читабелен, чем второй.

Джавад Зеб
источник
7

Использование простого цикла является наиболее эффективным способом сделать это.

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Предоставлено Programcreek

Райан
источник
Это вызовет исключение нулевого указателя, если массив содержит нулевую ссылку перед целевым значением.
Сэмюэль Эдвин Уорд
1
оператор if должен быть: if (targetValue.equals (s)), потому что String equals имеет проверку экземпляра.
TheArchon
вместо этого используйте Objects.equals (obj1, obj2) для обеспечения нулевой безопасности.
трилогия
7

В Java 8 используйте Streams.

List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
Shineed Basheer
источник
7
Есть ли преимущества у этого подхода?
Йоханнес Штадлер
1
Это не отвечает на вопрос.
Флориан Ф
5
  1. Для массивов ограниченной длины используйте следующее (как указано в camickr ). Это медленно для повторных проверок, особенно для более длинных массивов (линейный поиск).

     Arrays.asList(...).contains(...)
  2. Для быстрой производительности, если вы неоднократно проверяете по большому набору элементов

    • Массив - это неправильная структура. Используйте TreeSetи добавьте каждый элемент к нему. Он сортирует элементы и имеет быстрый exist()метод (бинарный поиск).

    • Если элементы реализуют Comparable& вы хотите TreeSetотсортировать соответственно:

      ElementClass.compareTo()Метод должен быть совместим с ElementClass.equals(): см. Триады не появляются, чтобы бороться? (Java Set отсутствует элемент)

      TreeSet myElements = new TreeSet();
      
      // 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:

      class MyComparator implements Comparator<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 comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
    • Выплата: проверьте наличие некоторого элемента:

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);
Глен Бест
источник
4
Зачем TreeSet? HashSetбыстрее (O (1)) и не требует упорядочения.
Шон Оуэн
4

Попробуй это:

ArrayList<Integer> arrlist = new ArrayList<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");
}
Mr.G
источник
4

Используйте следующее ( contains()методArrayUtils.in() в этом коде):

ObjectUtils.java

public class ObjectUtils{

    /**
     * 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.
     */
    public static boolean equals(Object object1, Object object2){
        return object1==null ? object2==null : object1.equals(object2);
    }

}

ArrayUtils.java

public class ArrayUtils{

    /**
     * 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.
     */
    public static <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)
     */
    public static <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.
     */
    public static <T> boolean in(final T[] ts, final T t){
        return indexOf(ts, t) > -1 ;
    }

}

Как вы можете видеть в приведенном выше коде, что существуют и другие методы полезности ObjectUtils.equals()и ArrayUtils.indexOf(), которые были использованы в других местах.

Абхишек Оза
источник
Я очень поздно присоединяюсь к этой дискуссии, но, поскольку мой подход к решению этой проблемы, когда я столкнулся с ней несколько лет назад, несколько отличался от других ответов, уже опубликованных здесь, я публикую то решение, которое я использовал в то время, здесь, на случай, если кто-нибудь найдет это полезным.
Абхишек Оза
3

Проверь это

String[] VALUES = new String[] {"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
    }
}
SubbaRao Boddu
источник
1
Это не работает - он будет вводить elseдля каждого элемента, который не соответствует (поэтому, если вы ищете «AB» в этом массиве, он будет идти туда 3 раза, так как 3 значения не являются «AB» «).
Бернхард Баркер
3

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

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}
TheArchon
источник
Arrays.asListэто не O (n). Это просто легкая обертка. Посмотрите на реализацию.
Патрик Паркер
3

Если вы не хотите, чтобы он был чувствительным к регистру

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);
Ахил Бабу К
источник
2

использование Array.BinarySearch(array,obj) для нахождения данного объекта в массиве или нет.

Пример:

if (Array.BinarySearch(str, i) > -1)`  true --exists

ложь - не существует

Мститель
источник
4
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 и остановите цикл. Тогда утверждают, что логическое значение истинно.

mandy1339
источник
1

Попробуйте использовать метод теста предикатов Java 8

Вот полный пример этого.

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java

Випул Гулхане
источник
0

использование Spliterator предотвращает ненужную генерацию List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == trueесли searchсодержится в массиве


это делает работу для массивов примитивов

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
Каплан
источник
0

Поскольку я имею дело с низкоуровневой Java, использующей примитивные типы byte и byte [], лучшее, что я получил на данный момент, - это bytes-java https://github.com/patrickfav/bytes-java, что кажется хорошей работой.

truthadjustr
источник
-2

Вы можете проверить это двумя способами

A) Путем преобразования массива в строку и проверки необходимой строки методом .contains

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

Б) это более эффективный метод

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }
Сайед Салман Хасан
источник
1
Преобразование строк абсурдно неэффективно, и решение неверно, например, содержит (",") вернет истину.
Atuos