Как определить, содержит ли массив определенное значение в 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);

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 коллекций, по-видимому, все еще не содержит неизменяемые типы коллекций, а синтаксис все еще слишком многословен, на мой вкус.)


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.
}

4
@ max4ever Я согласен, но это все же лучше, чем «сворачивать свои», и легче читать, чем сырой Java-способ.
Джейсон


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;
}

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 .

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


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));
    }
}

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);
}

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;
}

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");

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);

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");
}

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
    }
}

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.
}

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


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 );


-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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.