developer tip

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

optionbox 2020. 10. 5. 07:52
반응형

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


기본적으로 내 동료는 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);
}

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

감사합니다.


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

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == 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인수는 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>오토 박싱은 여기서 작동하지 않습니다.


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

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

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

Guava Primitives Explained 참조


나는 그것이 매우 늦게 알아,하지만 시도 Integer[]대신에 int[].


다른 방법 :

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)


1. 일회성 사용

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

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

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

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

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

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

Arrays.asList(int[] array).contains(int 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); 
}

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

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 + "[\\],].*");
}

Explanation: Javadoc of Arrays.toString() states the result is enclosed in square brackets and adjacent elements are separated by the characters ", " (a comma followed by a space). So we can count on this. First we convert array to a string, and then we check if key is contained in this string. Of course we cannot accept "sub-numbers" (e.g. "1234" contains "23"), so we have to look for patterns where the key is preceded with an opening bracket or a space, and followed by a closing bracket or a comma.

참고 : 사용 된 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;

              }


     }
}

참고 URL : https://stackoverflow.com/questions/12020361/java-simplified-check-if-int-array-contains-int

반응형