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

java arrays


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

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

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




Answer 1 camickr


Arrays.asList(yourArray).contains(yourValue)

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


Начиная с Java-8 теперь вы можете использовать потоки.

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

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

Example

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);



Answer 2 Tom Hawtin - tackline


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




Answer 3 Intracer


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

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

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

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

Example:

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

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}



Answer 4 icza


Просто выполняй его вручную:

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

Improvement:

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



Answer 5 Sireesh Yarlagadda


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

  1. Используя List :

    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) {  
        return Arrays.binarySearch(arr, targetValue) >= 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