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.