java 여부 - 배열에 Java의 특정 값이 포함되어 있는지 확인하는 방법은 무엇입니까?




13 Answers

Arrays.asList(yourArray).contains(yourValue)

경고 : 프리미티브 배열 (주석 참조)에서는 작동하지 않습니다.

java-8 부터 이제 Streams를 사용할 수 있습니다.

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

int , double 또는 long 의 배열에 값이 들어 있는지 여부를 확인하려면 각각 IntStream , DoubleStream 또는 LongStream 사용 IntStream .

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
자바 특정값

나는 String[] 과 같은 값을 갖는다.

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

주어진 String s , VALUESs 가 포함되어 있는지 여부를 테스트 할 수있는 좋은 방법이 있습니까?




Apache Commons Lang의 ArrayUtils.contains 를 사용할 수 있습니다.

public static boolean contains(Object[] array, Object objectToFind)

건네받은 배열이 null 경우,이 메소드는 false 돌려 null .

또한 모든 종류의 프리미티브 배열에 사용할 수있는 메서드가 있습니다.

예:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}



배열이 정렬되지 않으면 모든 것을 반복하고 각각에 대해 equals를 호출해야합니다.

배열이 정렬 된 경우 이진 검색을 수행 할 수 있습니다.이 Arrays 에는 Arrays 클래스가 있습니다.

일반적으로 말하자면, 많은 멤버십 검사를 수행하려는 경우 배열이 아닌 Set에 모든 것을 저장해야 할 수 있습니다.




그 가치가 무엇인지에 대해서는 속도에 대한 3 가지 제안을 비교하는 테스트를 실시했습니다. 난 임의의 정수를 생성하고 문자열로 변환하여 배열에 추가했습니다. 그런 다음 가능한 가장 높은 수 / 문자열을 검색했습니다. 이는 asList (). contains ()에 대한 최악의 시나리오입니다.

10K 어레이 크기를 사용할 때 결과는 다음과 같습니다.

Sort & Search   : 15
Binary Search   : 0
asList.contains : 0

100K 배열을 사용할 때 결과는 다음과 같습니다.

Sort & Search   : 156
Binary Search   : 0
asList.contains : 32

배열이 정렬 된 순서로 만들어지면 이진 검색이 가장 빠릅니다. 그렇지 않으면 asList (). contains가 이동 방법입니다. 검색 횟수가 많은 경우 이진 검색을 사용할 수 있도록 배열을 정렬하는 것이 좋습니다. 모두 응용 프로그램에 따라 다릅니다.

대부분의 사람들이 기대할 수있는 결과라고 생각합니다. 다음은 테스트 코드입니다.

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}



빠른 배열 초기화 구문을 사용하는 대신 Arrays.asList 메서드를 사용하여 비슷한 방식으로 곧바로 List로 초기화 할 수 있습니다. 예 :

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

그런 다음 위와 같이 할 수 있습니다. STRINGS.contains("the string you want to find");




ObStupidAnswer (하지만 어딘가에 여기에 교훈이 있다고 생각합니다) :

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}



Google 콜렉션 라이브러리가있는 경우 ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)을 사용하면 Tom의 답변을 훨씬 간단하게 만들 수 있습니다.

이것은 실제로 제안 된 초기화로부터 많은 혼란을 제거합니다.

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");



개발자는 종종 다음을 수행합니다.

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

위의 코드는 작동하지만 목록을 먼저 설정하여 변환 할 필요가 없습니다. 리스트를 세트로 변환하는 것은 여분의 시간이 필요합니다. 그것은 다음과 같이 간단 할 수 있습니다 :

Arrays.asList(arr).contains(targetValue);

또는

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

첫 번째 것은 두 번째 것보다 읽기 쉽습니다.




간단한 루프를 사용하는 것이 가장 효율적인 방법입니다.

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Programcreek 에게 의례




Arrays.asList () -> contains () 메서드를 호출하면 항상 작동하지만 Arrays.asList ()가 수행하는 배열 주위에 경량 목록 래퍼를 만들 필요가 없으므로 검색 알고리즘이 훨씬 향상됩니다. .

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}



나는이 토론에 참여하기가 너무 늦었지만이 문제를 해결하기위한 나의 접근 방식은 몇 년 전에 직면했을 때 이미 여기에 게시 된 다른 답변 들과는 조금 달랐다. 그 당시 내가 사용했던 해결책을 게시하고있다. 여기에 누군가가 유용하다고 생각할 때를 대비해서 : ( contains() 메소드는이 코드에서 ArrayUtils.in() 입니다.)

ObjectUtils.java

public class ObjectUtils{

/**
 * A null safe method to detect if two objects are equal.
 * @param object1
 * @param object2
 * @return true if either both objects are null, or equal, else returns false.
 */
public static boolean equals(Object object1,Object object2){
    return object1==null?object2==null:object1.equals(object2);
}

}

ArrayUtils.java

public class ArrayUtils{
/**
 * Find the index of of an object is in given array, starting from given inclusive index.
 * @param ts  Array to be searched in.
 * @param t  Object to be searched.
 * @param start  The index from where the search must start. 
 * @return Index of the given object in the array if it is there, else -1. 
 */
public static <T> int indexOf(final T[] ts, final T t, int start){
    for(int i = start; i < ts.length;++i)
        if(ObjectUtils.equals(ts[i],t))
            return i;
    return -1;
}

/**
 * Find the index of of an object is in given array, starting from 0;
 * @param ts  Array to be searched in.
 * @param t  Object to be searched.
 * @return  indexOf(ts,t,0)
 */
public static <T> int indexOf(final T[] ts, final T t){
    return indexOf(ts, t, 0);
}

/**
 * Detect if the given object is in the given array.
 * @param ts  Array to be searched in.
 * @param t  Object to be searched.
 * @return  If indexOf(ts,t) is greater than -1.
 */
public static <T> boolean in(final T[] ts, final T t){
    return indexOf(ts, t) > -1 ;
}

}

위의 코드에서 볼 수 있듯이 ObjectUtils.equals()ArrayUtils.indexOf() 와 같은 다른 유틸리티 메서드도 있으므로 다른 곳에서도 사용되었습니다.




이 시도:

ArrayList<Integer> arrlist = new ArrayList<Integer>(8);

// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);

boolean retval = arrlist.contains(10);
if (retval == true) {
    System.out.println("10 is contained in the list");
}
else {
    System.out.println("10 is not contained in the list");
}



최초로 false로 설정된 boolean를 작성합니다. 루프를 실행하여 배열의 모든 값을 검사하고 비교 대상 값과 비교하십시오. 일치하는 항목이 있으면 부울을 true로 설정하고 루핑을 중지하십시오. 그런 다음 부울이 참이라고 주장합니다.




Related

java arrays

Tags

java   arrays