배열에 Java의 특정 값이 포함되어 있는지 어떻게 확인합니까?


2276

나는 다음 String[]과 같은 값을 가지고있다 :

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

을 감안할 때 String s, 여부를 테스트하는 좋은 방법이 VALUES포함은 s?


5
먼 길을 가지만 for 루프를 사용할 수 있습니다. "for (String s : VALUES) if (s.equals ("MYVALUE ")) true 반환;
Zack

70
@camickr. 귀하의 질문에, 나는이 질문과 당신의 대답을 찬성했습니다. 왜냐하면 그것은 30 분과 20 줄의 코드 작성을 위해 못생긴 for 루프를 작성했기 때문입니다. 3 년 전에 읽지 않았습니다. (BTW, thanks :))
추구

3
@ camickr-나는 이것과 거의 동일한 상황을 가지고 있습니다 : stackoverflow.com/a/223929/12943 투표를 계속하고 있지만 태양 문서의 사본 / 붙여 넣기 일뿐입니다. 점수는 귀하가 얼마나 많은 도움을 주 었는지, 얼마나 많은 노력을 기울 였는지, 그리고 얼마나 빨리 게시하는지에 따라 결정됩니다! 어쩌면 우리는 John Skeet의 비밀을 우연히 발견했을 것입니다! 좋은 답변, +1
Bill K

1
Apache Commons를 사용하는 경우 org.apache.commons.lang.ArrayUtils.contains () 가이를 대신합니다.
Mr. Boy

34
@camickr 나와 같은 사람들이 Google에 질문하기 때문에 SO 결과를 클릭하고 답변을 확인한 후 테스트하고 작동하며 답변을 찬성하고 떠납니다.
Aequitas

답변:


2921
Arrays.asList(yourArray).contains(yourValue)

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


이후 이제 스트림을 사용할 수 있습니다.

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

배열이 있는지 여부를 확인하기 위해 int, double또는 long값의 사용을 포함 IntStream, DoubleStream또는 LongStream각각.

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

87
Arrays 클래스의 검색 함수 대 배열을 반복하고 프리미티브에 equals () 함수 또는 ==를 사용하는 것과 비교 하여이 성능에 대해 다소 궁금합니다.
토마스 오웬스

186
asList ()는 배열을 가진 ArrayList를 반환하므로 많이 잃지 않습니다. 생성자는 참조를 변경하여 많은 작업을 수행하지 않습니다. 그리고 contains () / indexOf ()는 반복하고 equals ()를 사용합니다. 프리미티브의 경우 직접 코딩하는 것이 좋습니다. 문자열이나 다른 클래스의 경우 차이점이 눈에 띄지 않습니다.
Joey

18
홀수, NetBeans는 'int [] holidays'에 대한 'Arrays.asList (holidays)'는 'list <int>'가 아니라 'list <int []>'를 반환한다고 주장합니다. 하나의 요소 만 포함합니다. 포함은 하나의 요소 만 있기 때문에 작동하지 않음을 의미합니다. int 배열
Nyerguds

62
Nyerguds : 사실, 이것은 프리미티브에는 적용되지 않습니다. 자바 프리미티브 유형에서는 일반적 일 수 없습니다. asList는 <T> List <T> asList (T ...)로 선언됩니다. int []를 전달하면 컴파일러는 T = int를 유추 할 수 없으므로 T = int []를 유추합니다. 프리미티브는 일반적 일 수 없기 때문입니다.
CromTheDestroyer

28
@Joey는 부수적 인 메모 ArrayList이지만 java.util.ArrayList예상 한 것은 아니지만 반환되는 실제 클래스는 다음 java.util.Arrays.ArrayList<E>과 같이 정의됩니다 public class java.util.Arrays {private static class ArrayList<E> ... {}}.
TWiStErRob

362

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수 있습니다. 심지어 공개 될 수도 있습니다.)

(* 브랜드에 대해 좀 더 설명하기 위해 collections API에는 여전히 불변 컬렉션 유형이 누락되어 있으며 구문은 여전히 ​​취향에 비해 너무 장황합니다.)


184
처음에 컬렉션을 만드는 것은 O (N)을 제외하고 :)
Drew Noakes

61
정적이라면 아마 몇 번 사용될 것입니다. 따라서 세트를 초기화하는 데 소요되는 시간은 많은 선형 검색 비용에 비해 상당히 작을 가능성이 높습니다.
Xr.

1
컬렉션을 생성하는 것은 코드 로딩 시간 (기술적으로 O (n)이지만 실제로는 일정 함)에 의해 지배 될 것입니다.
Tom Hawtin-tackline

2
@ TomHawtin-tackline 왜 "특히 여기서 우리는 세트를 원한다"고 말합니까? 이 경우 Set (HashSet)의 장점은 무엇입니까? "참조 배열"이 나쁜 이유는 무엇입니까 ( "참조 배열"이란 호출에 의해 생성 된 배열에 의해 지원되는 ArrayList를 의미 Arrays.asList합니까?)
Basil Bourque

6
@nmr A TreeSet는입니다 O(log n). HashSet버킷의 평균 요소 수가 거의 일정하도록 크기가 조정됩니다. 적어도 2 ^ 30까지의 배열에 대해. big-O 분석이 무시하는 하드웨어 캐시의 영향이있을 수 있습니다. 또한 해시 함수가 효과적으로 작동한다고 가정합니다.
Tom Hawtin-tackline

206

Apache Commons LangArrayUtils.contains 에서 사용할 수 있습니다

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

false전달 된 배열 이 인 경우이 메소드가 반환 됩니다 null.

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

예:

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

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

4
@ max4ever 동의하지만, 이것은 여전히 ​​"자신의 롤링"보다 낫고 원시 Java 방식을 읽는 것이 더 쉽습니다.
Jason


38
@ max4ever 때로는이 라이브러리가 이미 포함되어 있고 (다른 이유로) 완벽하게 유효한 답변입니다. 나는 이것을 찾고 있었고 이미 Apache Commons Lang에 의존하고 있습니다. 이 답변에 감사드립니다.
GuiSim

1
또는 메소드를 복사 할 수 있습니다 (있는 경우 중복성).
버팔로

10
@ max4ever 대부분의 안드로이드 앱은 Proguard로 최소화되어 필요한 클래스와 기능 만 앱에 제공합니다. 그것은 당신 자신을 굴 리거나 아파치 소스의 소스를 복사하는 것과 같습니다. 그리고 누구든지 그 minimalization를 사용하지 않는이 :) 700킬로바이트 또는 78킬로바이트에 대해 불평 할 필요가 없습니다
Kenyakorn Ketsombut

158

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

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

개량:

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

9
@Phoexo이 솔루션은 허용 된 답변이 배열을 목록으로 래핑하고 해당 목록에서 contains () 메서드를 호출하는 반면 내 솔루션은 기본적으로 contains () 만 수행하는 작업을 수행하기 때문에 더 빠릅니다.
icza

10
@AlastorMoody e == v는 매우 빠른 참조 평등 검사를 수행합니다. 동일한 객체 (참조와 동일)가 배열에 있으면 더 빨리 찾을 수 있습니다. 동일한 인스턴스가 아닌 경우 여전히 equals () 메소드에서 청구 한 것과 동일 할 수 있습니다. 이는 참조가 동일하지 않은 경우 점검됩니다.
icza

20
이 기능이 Java의 일부가 아닌 이유는 무엇입니까? 사람들이 Java가 부풀어 오른다 고 생각하는 것은 당연합니다 ... 필요한 모든 것이 for 루프 일 때 많은 라이브러리를 사용하는 위의 모든 대답을보십시오. 요즘 아이들!
phreakhead

4
@phreakhead 그것은 자바의 일부입니다Collection.contains(Object)
Steve Kuo

11
@icza 당신의 소스를 보면 Arrays하고 ArrayList이것이 빠르게 사용 버전보다 필요는 없다 것으로 나타났다 Arrays.asList(...).contains(...). 를 만드는 오버 헤드 ArrayList는 매우 작으며 ArrayList.contains()위에 표시된 것보다 더 스마트 한 루프 (실제로 두 개의 다른 루프를 사용함)를 사용합니다 (JDK 7).
Axel

72

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

1) 목록 사용 :

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

2) 세트 사용 :

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) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 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

5
이진 검색 예제는> 0을 반환해야합니다.
Will Sherwood

6
왜? 0은 배열의 헤드에 포함되어 있음을 나타내므로> -1을 반환해야한다고 생각합니다.
mbelow

1
첫 번째 변형 (a >= 0)은 정확 합니다. docs를 확인 하면 "키를 찾은 경우에만 반환 값이> = 0임을 보장합니다"라고 말합니다.
Yoory N.

왜 String이 아닌 int가 작동합니까? static boolean exist (int [] ints, int k) {return Arrays.asList (ints) .contains (k); }
Willians Martins

71

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

배열이 정렬되면 이진 검색을 수행 할 수 있습니다 . Arrays 클래스에 하나가 있습니다.

일반적으로 많은 멤버쉽 확인을 수행하려는 경우 모든 항목을 배열이 아닌 세트에 저장하려고 할 수 있습니다.


1
또한 내 대답에서 말했듯이 Arrays 클래스를 사용하면 배열을 정렬 한 다음 새로 정렬 된 배열에서 이진 검색을 수행 할 수 있습니다.
Thomas Owens

1
@ 토마스 : 동의합니다. 또는 TreeSet에 모든 것을 추가 할 수 있습니다. 같은 복잡성. 배열이 변경되지 않으면 배열을 사용합니다 (문자열은 아니지만 연속적으로 참조가 있기 때문에 약간의 메모리 위치를 저장할 수 있습니다). 시간이 지남에 따라 변경되면 세트를 사용합니다.
Uri

49

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

10K 배열 크기를 사용할 때 결과는 다음과 같습니다.

정렬 및 검색 : 15
이진 검색 : 0
asList.contains : 0

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

정렬 및 검색 : 156
이진 검색 : 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));
    }
}

6
이 코드를 이해하지 못합니다. 'strings'배열을 정렬하고 binarySearch를 호출 할 때 동일한 (정렬 된) 배열을 사용합니다. HotSpot 런타임 최적화 이외의 것을 어떻게 보여줄 수 있습니까? asList.contains 호출과 동일합니다. 정렬 된 배열에서 목록을 만든 다음 가장 높은 값을 가진 목록을 포함합니다. 물론 시간이 걸릴 것입니다. 이 테스트의 의미는 무엇입니까? 부적절하게 작성된 마이크로 벤치 마크라는 것은 말할 것도없고
Erik은

또한 이진 검색은 정렬 된 집합에만 적용 할 수 있으므로 이진 검색을 사용하는 유일한 방법은 정렬 및 검색입니다.
에릭

정렬은 여러 가지 다른 이유로 이미 수행되었을 수 있습니다. 예를 들어 초기화시 정렬 될 수 있으며 변경되지 않습니다. 자체적으로 검색 시간을 테스트하는 데 사용됩니다. 그러나 이것이 쓰러지는 곳은 마이크로 벤치마킹의 훌륭한 예가 아닙니다. 마이크로 벤치 마크는 Java에서 제대로 이해하기 어려운 것으로 악명 높으며, 예를 들어 실제 테스트 코드를 타이머로 ONCE보다 더 많이 실행하는 것은 물론 실제 테스트를 실행하기 전에 핫스팟 최적화를 얻을 수있을만큼 테스트 코드를 실행하는 것이 포함되어야합니다. 함정의 예
Thor84no

7
이 테스트는 동일한 JVM 인스턴스 에서 3 가지 테스트를 모두 실행하므로 결함이 있습니다. 후자의 테스트는 캐시, JIT 등을 예열하는 초기 테스트의 이점을 얻을 수 있습니다.
Steve Kuo

4
이 테스트는 실제로는 전혀 관련이 없습니다. 정렬 및 검색은 선형 적 (n * log (n)) 복잡성이며 이진 검색은 로그이고 ArrayUtils.contains는 분명히 선형입니다. 이 솔루션은 완전히 다른 복잡한 클래스에 있으므로이 솔루션을 비교할 필요가 없습니다.
드래그 함

37

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

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

그런 다음 위와 같이 할 수 있습니다.

STRINGS.contains("the string you want to find");

35

Java 8을 사용하면 스트림을 만들고 스트림의 항목이 일치하는지 확인할 수 있습니다 "s".

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

또는 일반적인 방법으로 :

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

3
기본 전문화에 주목할 가치가 있습니다.
skiwi

또한 anyMatchJavaDoc은이를 추가하기 "...May not evaluate the predicate on all elements if not necessary for determining the result."때문에 일치를 찾은 후 처리를 계속할 필요가 없을 수도 있습니다.
mkobit

28

Arrays 클래스 를 사용하여 값에 대한 이진 검색을 수행 할 수 있습니다 . 배열이 정렬되지 않은 경우 같은 클래스에서 정렬 함수를 사용하여 배열을 정렬 한 다음 검색해야합니다.


같은 클래스에서 정렬 함수를 사용하여 달성 할 수 있습니다 ... 내 답변에 추가해야합니다.
토마스 오웬스

1
아마도 asList (). contains () 접근 방식보다 비용이 많이들 것입니다. 검사를 자주 수행해야하는 경우가 아니라면 (정리하기 위해 정렬 할 수있는 정적 값 목록 인 경우).
Joey

진실. 가장 효과적인 변수가 많이 있습니다. 그래도 옵션이있는 것이 좋습니다.
토마스 오웬스

이 작업을 수행하는 일부 코드 : stackoverflow.com/a/48242328/9131078
OOBalance

검색 목적으로 전체 배열을 정렬하는 것은 비용이 많이 듭니다. 라이너 검색 자체에 동일한 CPU 시간을 사용할 수 있습니다. 미리 정렬 된 순서로 이미 구성된 컬렉션에서 이진 검색을 선호합니다.
arunwithasmile

17

ObStupidAnswer (그러나 여기 어딘가에 교훈이 있다고 생각합니다) :

enum Values {
    AB, BC, CD, AE
}

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

1
예외 던지는 것은 명백히 무겁지만 이것이 효과가 있다면 값을 테스트하는 새로운 방법입니다. 단점은 열거 형을 미리 정의해야한다는 것입니다.
James P.

13

실제로 Tom Hawtin이 제안한대로 HashSet <String>을 사용하면 정렬에 대해 걱정할 필요가 없으며 속도는 미리 정렬 된 배열의 이진 검색과 동일하며 아마도 더 빠릅니다.

그것은 모두 코드가 어떻게 설정되어 있는지에 달려 있지만, 내가 서있는 순서는 다음과 같습니다.

정렬되지 않은 배열 :

  1. 해시 세트
  2. asList
  3. 정렬 및 이진

정렬 된 배열에서 :

  1. 해시 세트
  2. 이진
  3. asList

어느 쪽이든, 승리를위한 HashSet.


2
HashSet 멤버쉽은 O (1)이어야하고 정렬 된 컬렉션에서 이진 검색은 O (log n)입니다.
Skylar Saveland

11

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

10

하나의 가능한 해결책 :

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}

8

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

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;

첫 번째는 두 번째보다 더 읽기 쉽습니다.


7

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

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

에 의례 Programcreek


배열에 대상 값 앞에 null 참조가 포함되어 있으면 null 포인터 예외가 발생합니다.
Samuel Edwin Ward

1
String equals에 instanceof checker가 있기 때문에 if 문은 : if (targetValue.equals (s))이어야합니다.
TheArchon

null 안전을 위해 Objects.equals (obj1, obj2)를 대신 사용하십시오.
3 부작 '

7

에서 자바 8은 스트림 사용합니다.

List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);

7
이 방법에는 어떤 이점이 있습니까?
Johannes Stadler

1
질문에 대답하지 않습니다.
Florian F

5
  1. 길이가 제한된 배열의 경우 다음을 사용하십시오 ( camickr 제공 ). 반복 검사, 특히 긴 배열 (선형 검색)의 경우 속도가 느립니다.

     Arrays.asList(...).contains(...)
  2. 더 큰 요소 집합을 반복해서 확인하면 빠른 성능을 위해

    • 배열이 잘못된 구조입니다. a를 사용하고 TreeSet각 요소를 추가하십시오. 요소를 정렬하고 빠른 exist()방법 (이진 검색)이 있습니다.

    • 요소가 구현 Comparable되고 TreeSet그에 따라 정렬 하려는 경우 :

      ElementClass.compareTo()방법으로하게 호환되어야합니다 ElementClass.equals()참조 : 싸울 표시되지 화음을? (자바 세트에 항목이 없음)

      TreeSet myElements = new TreeSet();
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
      // *Alternatively*, if an array is forceably provided from other code:
      myElements.addAll(Arrays.asList(myArray));
    • 그렇지 않으면 자신의 것을 사용하십시오 Comparator:

      class MyComparator implements Comparator<ElementClass> {
           int compareTo(ElementClass element1; ElementClass element2) {
                // Your comparison of elements
                // Should be consistent with object equality
           }
      
           boolean equals(Object otherComparator) {
                // Your equality of comparators
           }
      }
      
      
      // construct TreeSet with the comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
    • 지불 : 일부 요소의 존재를 확인하십시오.

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);

4
왜 귀찮게 TreeSet? HashSet더 빠르며 (O (1)) 주문할 필요가 없습니다.
Sean Owen

4

이 시도:

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

4

다음을 사용하십시오 (이 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()다른 곳에서도 사용 된 유틸리티 메소드 가 있습니다.


나는이 토론에 참여하기에 너무 늦었지만 몇 년 전에 직면했을 때이 문제를 해결하기위한 나의 접근 방식이 이미 여기에 게시 된 다른 답변과 약간 달랐기 때문에 당시에 사용한 솔루션을 게시하고 있습니다. 누군가가 유용하다고 생각하는 경우 여기에.
Abhishek Oza

3

이것을 확인하십시오

String[] VALUES = new String[] {"AB","BC","CD","AE"};
String s;

for(int i=0; i< VALUES.length ; i++)
{
    if ( VALUES[i].equals(s) )
    { 
        // do your stuff
    } 
    else{    
        //do your stuff
    }
}

1
이것은 작동하지 않습니다- 일치하지 않는 모든 항목에 else대해 를 입력합니다 (따라서 해당 배열에서 "AB"를 찾고 있다면 값 중 3 개가 "AB가 아니기 때문에 3 번 이동합니다" ").
Bernhard Barker

3

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.
}

Arrays.asListO (n)이 아닙니다. 가벼운 포장지입니다. 구현을 살펴보십시오.
Patrick Parker

3

대소 문자를 구분하지 않으려면

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);

2

Array.BinarySearch(array,obj)주어진 객체를 배열에서 찾거나 찾을 때 사용 합니다.

예:

if (Array.BinarySearch(str, i) > -1)`  true --exists

거짓-없음


4
Array.BinarySearchArray.FindIndex.NET 방법이며, 자바에 존재하지 않습니다.
ataylor

@ ataylor Java에는 Arrays.binarySearch가 있습니다. 그러나 당신 말이 맞아요. Arrays.findIndex
mente

그것은 주목해야한다 :The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
도리안 그레이에게

1

부울을 처음에 false로 설정하십시오. 루프를 실행하여 배열의 모든 값을 확인하고 확인중인 값과 비교하십시오. 일치하는 것이 있으면 부울을 true로 설정하고 루핑을 중지하십시오. 그런 다음 부울이 참이라고 주장하십시오.


1

Java 8 술어 테스트 방법을 사용해보십시오

여기에 전체 예가 있습니다.

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

의 사용은 Spliterator 불필요한 생성을 방지합니다 List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == true만약 search상기 어레이에 포함


수행 프리미티브의 배열에 대한 작업을

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );


-2

두 가지 방법으로 확인할 수 있습니다

A) 배열을 문자열로 변환 한 다음 .contains 메소드로 필요한 문자열을 확인하십시오.

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

B) 이보다 효율적인 방법입니다

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }

1
문자열 변환은 터무니없이 비효율적이며 솔루션이 올바르지 않습니다. 예를 들어 contains ( ",")는 true를 반환합니다.
Atuos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.