배열에 Java의 특정 값이 포함되어 있는지 확인하는 방법

java arrays


다음 과 같은 값을 가진 String[] 이 있습니다.

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

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




Answer 1 camickr


Arrays.asList(yourArray).contains(yourValue)

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


java-8 부터는 이제 스트림을 사용할 수 있습니다.

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

int , double 또는 long 배열에 값이 포함되어 있는지 확인하려면 각각 IntStream , DoubleStream 또는 LongStream 을 사용 하십시오 .

Example

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



Answer 2 Tom Hawtin - tackline


Java SE 9에 대한 간결한 업데이트

참조 배열이 잘못되었습니다. 이 경우 우리는 세트 후입니다. Java SE 9부터 Set.of 가 있습니다.

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

"문자열 제공, VALUES에 s가 포함되어 있는지 테스트하는 좋은 방법이 있습니까?"

VALUES.contains(s)

O(1).

적당한 유형 , 불변 , O (1)간결한 . 아름다운.*

원래 답변 세부 사항

시작하기 위해 코드를 정리하십시오. 우리는 (수정했습니다) :

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

이것은 FindBugs가 당신에게 매우 나쁜 것이라고 말할 가변 정적입니다. 정적을 수정하지 말고 다른 코드도 수정하지 마십시오. 최소한 최소한이 필드는 개인용이어야합니다.

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

실제로 new String[]; 비트를 삭제할 수 있습니다 .

참조 배열은 여전히 ​​나쁘고 세트를 원합니다.

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(이것이 Collections.unmodifiableSet 에 싸여 있으면 나 같은 파라노이드 사람들이 더 편하게 느낄 수 있습니다.

(* 브랜드에 대해 조금 더 이야기하자면 컬렉션 API에는 여전히 변경 불가능한 컬렉션 유형이 누락되어 있으며 구문은 여전히 ​​취향에 비해 너무 장황합니다.)




Answer 3 Intracer


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

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

건네받은 배열이 null 의 경우, 이 메소드는 false 를 돌려 줍니다 .

모든 종류의 기본 배열에 사용할 수있는 메소드도 있습니다.

Example:

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

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



Answer 4 icza


손으로 간단하게 구현하십시오.

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

Improvement:

v != null 상태에있어서, 내부에 일정하다. 메소드 호출 중에 항상 동일한 부울 값으로 평가됩니다. 따라서 입력 array 이 크면이 조건을 한 번만 평가하는 것이 더 효율적이며 결과를 기반으로 for 루프 내에서 단순화 / 빠른 조건을 사용할 수 있습니다. 개선 된 contains() 메소드 :

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}



Answer 5 Sireesh Yarlagadda


배열에 값이 포함되어 있는지 확인하는 4 가지 다른 방법

  1. List 사용 :

    public static boolean useList(String[] arr, String targetValue) {
        return Arrays.asList(arr).contains(targetValue);
    }
  2. Set 사용 :

    public static boolean useSet(String[] arr, String targetValue) {
        Set<String> set = new HashSet<String>(Arrays.asList(arr));
        return set.contains(targetValue);
    }
  3. 간단한 루프 사용하기 :

    public static boolean useLoop(String[] arr, String targetValue) {
        for (String s: arr) {
            if (s.equals(targetValue))
                return true;
        }
        return false;
    }
  4. 사용 Arrays.binarySearch() :

    아래 코드가 잘못되었습니다. 완성도를 위해 여기에 나열되어 있습니다. binarySearch() 는 정렬 된 배열에서만 사용할 수 있습니다. 아래에서 결과가 이상하다는 것을 알 수 있습니다. 배열을 정렬 할 때 가장 좋은 옵션입니다.

    public static boolean binarySearch(String[] arr, String targetValue) {  
        return Arrays.binarySearch(arr, targetValue) >= 0;
    }

빠른 예 :

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false