Вопрос-ответ

How do I determine whether an array contains a particular value in Java?

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

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

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

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

Переведено автоматически
Ответ 1
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);
Ответ 2

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

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

Ответ 3

Вы можете использовать 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

Просто реализуйте это вручную:

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