Java, int 배열에 int가 포함되어 있는지 간단하게 확인


94

기본적으로 내 동료는 int 배열에 int가 포함되어 있는지 확인하는 다른 방법을 사용하여 코드를 더 짧게 만들 수 있다고 말하고 있습니다.

흐름:

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

누구든지 나를 도울 수 있습니까?

감사합니다.


8
Arrays.asList (...) 호출은 vararg를 사용합니다. 즉, List에 전달할 수있는 임의의 수의 인수를 래핑합니다. 귀하의 경우에는 단일 요소가있는 배열 목록을 얻고 있으며이 목록에는 분명히 int가 포함되어 있지 않습니다.
— sarcan

당신의 코멘트는 지금 무엇을 의미합니까?
— sarcan

Hashset기반 재심 메커니즘 답변을 확인하십시오 . 가장 빠른 방법입니다.
— Amit Deshpande

귀하의 인수가 원시 배열이고 코드가 매우 명확하고 간단하기 때문에 원본 코드를 더 짧게 만드는 데 아무런 의미가 없습니다. ArrayList구현도 마찬가지입니다.
— Genzer

나는 당신의 코드를 더 짧게 만들지 않을 것입니다. (1) arraylist는 당신이 한 것과 같은 일을합니다. (2)-더 중요한 것은 Arrays.asList를 사용하는 단축 코드가 새로운 객체를 생성한다는 것입니다. 이는 성능에 중요한 코드 내에서 문제가 될 수 있습니다. 첫 번째 코드 스 니펫은 가장 좋은 방법입니다.
— 마틴 Podval

답변:


38

다음은 Java 8 솔루션입니다.

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == key);
}

63

ArrayUtils.contains에서 간단히 사용할 수 있습니다 Apache Commons Lang library.

public boolean contains(final int[] array, final int key) {     
    return ArrayUtils.contains(array, key);
}

1
만큼 당신이 사용 ArrayUtils있는 그대로, 사용하지 않을 어떤 이유가 ArrayUtils.contains은
— mjohnsonengr

2
어떤 이유는 전혀 없습니다 :
— Reimeus

20
그것이 도서관의 ArrayUtils.contains()일부 라는 점 은 주목할 가치가 Apache Commons Lang있습니다. D : 그 좋은 LIB는 비록,이 배열 요소가 포함되어있는 경우 바로 확인하는 외부 종속성을 추가하기 위해 여전히 아마 좋은 생각이 아니다
— Krzysiek

2
ArrayUtils는 과거의 일입니다. Java 8+와 Guava는 정말 놀라운 기능을 가지고 있습니다 !!
— TriCore

34

그것은 Arrays.asList(array)return 때문 List<int[]>입니다. array인수는 vararg가 아닌 랩핑하려는 하나의 값으로 처리됩니다 (int의 배열 목록을 얻음).

참고는 것을 않는 개체 유형 (안 원시)와 함께 작업을 :

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>오토 박싱은 여기서 작동하지 않습니다.


1
autoboxing이 작동하지 않는 이유는 최종적으로 선언 되었기 때문입니까?
— subhashis

19

Guava는 기본 유형에 대한 추가 메소드를 제공합니다. 그들 중에는 당신과 동일한 인수를 취하는 contains 메소드가 있습니다.

public boolean contains(final int[] array, final int key) {
    return Ints.contains(array, key);
}

구아바 버전을 정적으로 가져올 수도 있습니다.

Guava Primitives Explained 참조


18

다른 방법 :

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)


30
contains메서드가 내 배열을 수정 하면 놀랄 것 같습니다 .
— Zong

@ZongLi : 우리가 하찮은 일에 속 태우고있는 경우는 OP.Updated OP 단지 예입니다
— Cratylus

5
binarySearch ()의 javadoc에서 : "반환 값은 키가 발견 된 경우에만> = 0이됩니다." 그래서 Arrays.binarySearch (array, key)> = 0이 반환되어야합니다!
— icza 2014

보충 : -1 이외의 값일 수있는 키가 포함되지 않은 경우 binarySearch ()의 반환 값은 (-(삽입 지점)-1)입니다.
— icza 2014

이것이 -1사실이라면 불가능합니다. "삽입 지점은 키가 목록에 삽입되는 지점으로 정의됩니다. 키보다 큰 첫 번째 요소의 인덱스 또는 목록의 모든 요소가 지정된 키보다 작은 경우 list.size ()입니다. ". 말할 필요가 있습니다 >= 0.
— Brian


1

1. 일회성 사용

List<T> list=Arrays.asList(...)
list.contains(...)

2. 두 번 이상 사용하는 경우 성능 고려를 위해 HashSet을 사용하십시오.

Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)

1

이 시도:

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

1

아래의 Java 8 코드를 사용하여 기본 int 배열을 정수 배열 목록으로 변환 할 수 있습니다.

List<Integer> arrayElementsList = Arrays.stream(yourArray).boxed().collect(Collectors.toList());

그런 다음 contains()메소드를 사용 하여 목록에 특정 요소가 포함되어 있는지 확인하십시오.

boolean containsElement = arrayElementsList.contains(key);

0

이것은 자바 8에서 작동했습니다.

public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}

첫 번째 일치에서 즉시 반환되어야합니다. 대신 일치 항목을 찾았더라도 배열의 모든 항목을 검색합니다. (트리 온 아이템 배열 고려)
— TriCore

이 public static boolean contains (final int [] array, final int key) {return Arrays.stream (array) .anyMatch (n-> n == key); }
— Farhad Baghirov

Java 8 스트림 anyMatch는 단락 작업 이며 배열의 모든 항목을 스캔하지 않습니다.
— LordParsley

@LordParsley 위 코드의 목표는 배열의 모든 요소를 ​​스캔하는 것이 아니라 배열의 요소를 확인하는 것입니다.
— Farhad Baghirov

죄송합니다. 답변이 수정되었습니다. 한 부분을 찾으면 모두 스캔 할 필요가 없기 때문에 정확했습니다.
— LordParsley

0

java.util.Arrays클래스를 사용 하여 다음 과 같은 메소드 T[?]로 List<T>객체 의 배열을 변환 할 수 있습니다 contains.

Arrays.asList(int[] array).contains(int key);

-1

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

솔루션 # 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(정렬)합니다.


String handlig는 일반적으로 비용이 많이 듭니다. 왜 누군가 int를 문자열로 취급해야합니까?
— Denys Vitali

@DenysVitali op는 이미 작동하고 효율적인 솔루션을 가지고 있으며 더 짧은 솔루션을 찾고 있기 때문입니다 . 그리고 이것들은 더 짧습니다. 이 질문은 성능에 관한 것이 아닙니다.
— icza

질문을 잘못 이해
— Denys Vitali

-5

이렇게 해봐 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;

              }


     }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.