Ответ 1
Вы можете просто использовать ArrayUtils.contains
из Apache Commons Lang library
.
public boolean contains(final int[] array, final int key) {
return ArrayUtils.contains(array, key);
}
В основном мой помощник говорил, что я мог бы сделать свой код короче, используя другой способ проверки, если int-массив содержит int, хотя он не скажет мне, что это такое: P.
Текущее:
public boolean contains(final int[] array, final int key) {
for (final int i : array) {
if (i == key) {
return true;
}
}
return false;
}
Также попробовал это, хотя по какой-то причине он всегда возвращает false.
public boolean contains(final int[] array, final int key) {
return Arrays.asList(array).contains(key);
}
Может ли кто-нибудь помочь мне?
Спасибо.
Вы можете просто использовать ArrayUtils.contains
из Apache Commons Lang library
.
public boolean contains(final int[] array, final int key) {
return ArrayUtils.contains(array, key);
}
Это потому, что Arrays.asList(array)
return List<int[]>
. Аргумент array
рассматривается как одно значение, которое вы хотите обернуть (вы получаете список массивов из int), а не как vararg.
Обратите внимание, что он работает с типами объектов (не примитивов):
public boolean contains(final String[] array, final String key) {
return Arrays.asList(array).contains(key);
}
или даже:
public <T> boolean contains(final T[] array, final T key) {
return Arrays.asList(array).contains(key);
}
Но вы не можете иметь List<int>
, и здесь не работает autoboxing.
Вот решение Java 8
public static boolean contains(final int[] arr, final int key) {
return Arrays.stream(arr).anyMatch(i -> i == key);
}
Guava предлагает дополнительные методы для примитивных типов. Среди них есть метод, который принимает те же аргументы, что и ваши.
public boolean contains(final int[] array, final int key) {
return Ints.contains(array, key);
}
Вы можете также статически импортировать версию guava.
Другой способ:
public boolean contains(final int[] array, final int key) {
Arrays.sort(array);
return Arrays.binarySearch(array, key) >= 0;
}
Изменяет переданный массив. У вас будет возможность скопировать массив и работать с исходным массивом, т.е. int[] sorted = array.clone();
Но это всего лишь пример короткого кода. Время выполнения O(NlogN)
, тогда как ваш путь O(N)
Я знаю, что это очень поздно, но попробуйте Integer[]
вместо int[]
.
Если массив является int, double или long, мы можем использовать эти IntStream, DoubleStream или LongStream соответственно
int[] values = { 1, 33, 55, 66 };
int testValue = 33;
boolean contains = IntStream.of(values).anyMatch(x -> x == testValue);
Reference- Проверка значения в массиве
1. one-off использует
List<T> list=Arrays.asList(...)
list.contains(...)
2. Использовать HashSet для рассмотрения производительности, если вы используете более одного раза.
Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)
Вы можете использовать класс java.util.Arrays
для преобразования массива T[?]
В объект List<T>
с помощью методов, таких как contains
:
Arrays.asList(int[] array).contains(int key);
это работало в java 8
public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}
Попробуй это:
public static void arrayContains(){
int myArray[]={2,2,5,4,8};
int length=myArray.length;
int toFind = 5;
boolean found = false;
for(int i = 0; i < length; i++) {
if(myArray[i]==toFind) {
found=true;
}
}
System.out.println(myArray.length);
System.out.println(found);
}
Вы можете преобразовать свой примитивный массив int в массив целых чисел, используя приведенный ниже код Java 8,
List<Integer> arrayElementsList = Arrays.stream(yourArray).boxed().collect(Collectors.toList());
А затем используйте метод contains()
чтобы проверить, содержит ли список определенный элемент,
boolean containsElement = arrayElementsList.contains(key);
В зависимости от того, насколько велика будет ваш массив int, вы получите гораздо лучшую производительность, если вы используете коллекции и .contains
, а не итерации по массиву по одному элементу за раз:
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import org.junit.Before;
import org.junit.Test;
public class IntLookupTest {
int numberOfInts = 500000;
int toFind = 200000;
int[] array;
HashSet<Integer> intSet;
@Before
public void initializeArrayAndSet() {
array = new int[numberOfInts];
intSet = new HashSet<Integer>();
for(int i = 0; i < numberOfInts; i++) {
array[i] = i;
intSet.add(i);
}
}
@Test
public void lookupUsingCollections() {
assertTrue(intSet.contains(toFind));
}
@Test
public void iterateArray() {
assertTrue(contains(array, toFind));
}
public boolean contains(final int[] array, final int key) {
for (final int i : array) {
if (i == key) {
return true;
}
}
return false;
}
}
Решение № 1
Поскольку исходный вопрос требует только упрощенного решения (а не более быстрого), здесь однострочное решение:
public boolean contains(int[] array, int key) {
return Arrays.toString(array).matches(".*[\\[ ]" + key + "[\\],].*");
}
Объяснение: Javadoc из Arrays.toString()
указывает, что результат заключен в квадратные скобки, а смежные элементы разделены символами "," (запятая, за которой следует пробел). Поэтому мы можем рассчитывать на это. Сначала мы преобразуем array
в строку, а затем проверяем, содержится ли key
в этой строке. Конечно, мы не можем принимать "под-номера" (например, "1234" содержит "23" ), поэтому мы должны искать шаблоны, где key
предшествует открывающая скобка или пробел, а затем закрывающая скобка или запятая.
Примечание. Использованный шаблон regexp также правильно обрабатывает отрицательные числа (строковое представление которого начинается со знака минус).
Решение №2
Это решение уже опубликовано, но оно содержит ошибки, поэтому я отправляю правильное решение:
public boolean contains(int[] array, int key) {
Arrays.sort(array);
return Arrays.binarySearch(array, key) >= 0;
}
Также это решение имеет побочный эффект: он изменяет array
(сортирует его).
Попробуйте Integer.parseInt()
сделать это.....
public boolean chkInt(final int[] array){
int key = false;
for (Integer i : array){
try{
Integer.parseInt(i);
key = true;
return key;
}catch(NumberFormatException ex){
key = false;
return key;
}
}
}