1980

나는String[]값은 다음과 같습니다.

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

주어진String s, 여부를 테스트하는 좋은 방법입니다VALUES포함하다s?


  • 그 주위에 먼 길이지만 for 루프를 사용할 수 있습니다 : for (String s : VALUES) if (s.equals ( "MYVALUE"))가 true를 반환하면 for 루프를 사용할 수 있습니다. - Zack
  • 사람들이 아직도이 대답을 상향 투표 한 이유는 무엇입니까 (현재 75)? 그것의 2 살 및 아주 간단한 응답. 내가 한 모든 것은 누군가를 API 메소드로 향하게하는 것이 었습니다. 나는 어떤 대답도 너무 놀라워서이 엄청난 수의 upvotes를받을 가치가 없다고 생각하지 않는다. - camickr
  • @camickr. 귀하의 질문에, 나는이 질문과 답변을 upvoted - 그것은 - 나를 위해 루프에 대한 추악한 코드 작성의 30 분 및 20 줄을 구했기 때문에 - 아 - -. 3 년 전에 읽지 못했습니다. (BTW, 고마워 :)) - Pursuit
  • @ camickr - 나는 이것과 거의 동일한 상황을 가지고있다 :stackoverflow.com/a/223929/12943그냥 투표를 계속하고 있지만 아직 sun의 문서에서 복사 / 붙여 넣기 만했습니다. 나는 당신이 얼마나 많은 도움을 주 었는지, 그리고 얼마나 많은 노력을 기울 였는지에 따라 스코어를 결정할 것입니다. 아마도 John Skeet의 비결을 발견했을 것입니다. 음, 좋은 대답, +1. - Bill K
  • @ camickr 왜냐하면 사람들이 나와 같은 Google 질문을 클릭하면 결과를보고, 답변을보고, 테스트하고, 작동하고, 대답을 upvote하고 떠난다. - Aequitas

25 답변


2560

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


  • 배열에 대한 iterating과 equals () 함수 또는 ==를 사용하여 primitives에 대해 Array 클래스의 검색 함수와 비교하여이 기능을 수행하는 것에 대해 다소 궁금합니다. - Thomas Owens
  • asList ()가 배열을 마음에 가지고있는 ArrayList를 반환하기 때문에 많이 잃지는 않습니다. 생성자가 참조를 변경하기 때문에 참조가 변경되지 않습니다. contains () / indexOf ()는 equals ()를 반복하여 사용합니다. 프리미티브의 경우 직접 코딩하는 것이 좋습니다. 문자열이나 다른 클래스의 경우 차이가 눈에 띄지 않습니다. - Joey
  • 이상하게도 NetBeans는 'Arrays.asList (holidays) ' < int [] 휴일 ' < int > &' 목록이 아닌 < int > &' 목록을 반환합니다. 하나의 요소 만 포함합니다. Contains는 하나의 요소 만 가지고 있기 때문에 작동하지 않습니다. int 배열 - Nyerguds
  • Nyerguds : 실제로, 이것은 프리미티브 (primitives)에서는 작동하지 않습니다. java 기본 유형은 generic 일 수 없습니다. asList는 < T >로 선언된다. 목록 < T > asList (T ...). int []를 전달하면 컴파일러는 T = int []를 추론합니다. 왜냐하면 원시는 기본 적이 지 않기 때문에 T = int를 유추 할 수 없기 때문입니다. - CromTheDestroyer
  • @ 그냥 부수적 인 말로ArrayList, 하지만java.util.ArrayList예상대로, 리턴 된 실제 클래스는 다음과 같습니다.java.util.Arrays.ArrayList<E>로써 정의 된:public class java.util.Arrays {private static class ArrayList<E> ... {}}. - TWiStErRob

322

처음부터 코드를 삭제하십시오. 우리는 (수정) :

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

"String이 주어지면 VALUES에 s가 포함되어 있는지 테스트 할 수있는 좋은 방법이 있습니까?"

VALUES.contains(s)

O (1).


  • 첫 번째 장소에서 컬렉션을 만들려면 O (N)을 제외하고 :) - Drew Noakes
  • 정적이라면 꽤 자주 사용하게 될 것입니다. 따라서 집합을 초기화하는 데 소모되는 시간은 많은 선형 검색 비용에 비해 아주 작을 가능성이 큽니다. - Xr.
  • 그런 다음 콜렉션을 생성하는 것은 코드 로딩 시간 (기술적으로 O (n)이지만 실질적으로 일정 함)에 의해 지배 될 것입니다. - Tom Hawtin - tackline
  • @ TomHawtin-tackline 왜 당신은 " 특히 여기서 우리는 세트 "라고 말합니까? 이 경우 Set (HashSet)의 이점은 무엇입니까? 왜 "참조 배열"은? 나쁘다 ( "참조 배열"에 의한) 당신은 배열에 의해 뒷받침되는 ArrayList를 호출하여 생성 된 배열을 의미합니까?Arrays.asList)? - Basil Bourque
  • @nmr ATreeSet~ 될거야.O(log n).HashSet버킷의 평균 요소 수가 대략 일정하도록 스케일됩니다. 최소한 2 ^ 30까지의 배열에 대해서. big-O 분석이 무시하는 하드웨어 캐시의 영향이있을 수 있습니다. 또한 해시 함수가 효과적으로 작동한다고 가정합니다. - Tom Hawtin - tackline

179

당신이 사용할 수있는ArrayUtils.contains...에서아파치 커먼즈 랭

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

이 메소드는false건네받은 배열이null.

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

예:

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

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


  • 78kb 안드로이드 응용 프로그램을위한 300kb 라이브러리, 항상 좋은 것은 아닙니다. - max4ever
  • @ max4ever 동의하지만, 여전히 자신의 " 롤링 중 " 원시 자바 방식을 읽기가 더 쉽다. - Jason
  • 꾸러미:org.apache.commons.lang.ArrayUtils - slamborne
  • @ max4ever 가끔은 이미이 라이브러리가 포함되어 있습니다 (다른 이유로). 이것은 완벽하게 유효한 대답입니다. 나는 이것을 찾고 있었고 이미 Apache Commons Lang에 의존하고있다. 이 답변을 주셔서 감사합니다. - GuiSim
  • @ max4ever Proguard는 대부분의 안드로이드 앱을 최소화하여 앱에 필요한 클래스와 기능 만 제공합니다. 그것은 당신 자신의 것을 굴리는 것과 동일하게 만들거나, 아파치 일의 소스를 복사한다. 그 최소화를 사용하지 않은 사람은 700kb 또는 78kb에 대해 불평 할 필요가 없습니다. :) - Kenyakorn Ketsombut

146

아무도 손으로 직접 구현하지 말라는 사실에 놀랐습니다.

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


  • @Phoexo이 솔루션은 명백히 받아 들여진 응답이리스트를 배열로 래핑하고 내 솔루션이 기본적으로 contains () 만 수행하는 동안 목록의 contains () 메소드를 호출하기 때문에 분명히 빠릅니다. - icza
  • @AlastorMoody e == v 매우 빠른 참조 평등 검사를 수행합니다. 동일한 객체 (참조로 동일 함)가 배열에 있으면 더 빨리 발견됩니다. 같은 인스턴스가 아닌 경우, equals () 메소드에 의해 요구 된 것과 같을 가능성이있어, 참조가 동일하지 않은 경우에 체크됩니다. - icza
  • 이 기능이 자바의 일부가 아닌 이유는 무엇입니까? 사람들이 자바가 부풀어 오르는 것은 당연한 일입니다 ... 위의 모든 대답을 보시려면 필요한 모든 것이 for 루프 인 경우 많은 라이브러리를 사용하십시오. 요즘 아이들! - phreakhead
  • @phreakhead 자바의 일부입니다.Collection.contains(Object) - Steve Kuo
  • @icza 소스를 보면ArraysArrayList이 버전이 사용하는 버전보다 반드시 빠르지는 않습니다.Arrays.asList(...).contains(...). 창작의 오버 헤드ArrayList매우 작고ArrayList.contains()(JDK 7)보다 똑똑한 루프를 사용합니다. 실제로는 두 개의 다른 루프를 사용합니다. - Axel

65

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

배열이 정렬 된 경우 이진 검색을 수행 할 수 있습니다.배열수업.

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


  • 또한, 내 대답에서 말했듯이, Arrays 클래스를 사용하면 배열을 정렬 한 다음 새로 정렬 된 배열에서 이진 검색을 수행 할 수 있습니다. - Thomas Owens
  • @ 토마스 : 나는 동의한다. 또는 모든 것을 TreeSet에 추가 할 수 있습니다. 같은 복잡성. 문자열이 변경되지 않았더라도 참조가 연속적으로 위치하기 때문에 약간의 메모리 지역을 절약 할 수 있다면 배열을 사용하지 않을 것입니다. 시간이 지남에 따라 변경 될 경우 세트를 사용합니다. - Uri

62

배열에 값이 포함되어 있는지 확인하는 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


  • 이진 검색 예제는 > 0; - Will Sherwood
  • 왜? 나는 그것이 > -1은 0이 배열의 맨 앞에 포함되어 있음을 나타 내기 때문입니다. - mbelow
  • 첫 번째 변종은(a >= 0)올바른지, 그냥 확인했다.문서그들은 "이것은 키가 발견되는 경우에만 리턴 값이 > = 0이 될 것이라는 것을 보장한다"라고 말한다. - Yoory N.

46

그 가치가 무엇인지에 대해서는 속도에 대한 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));
    }
}


  • 이 코드를 이해할 수 없습니다. 배열 ' 문자열 ' binarySearch에 대한 두 호출 모두에서 동일한 (정렬 된) 배열을 사용하십시오. HotSpot 런타임 최적화를 제외한 모든 것을 어떻게 보여줄 수 있습니까? asList.contains 호출과 동일합니다. 정렬 된 배열에서 목록을 만든 다음 가장 높은 값을 가진 목록을 포함합니다. 물론 시간이 걸릴 것입니다. 이 검사의 의미는 무엇입니까? 부적절하게 작성된 마이크로 벤치 마크는 말할 것도 없습니다. - Erik
  • 또한 이진 검색은 정렬 된 집합에만 적용될 수 있으므로 이진 검색을 사용하는 유일한 방법은 정렬 및 검색입니다. - Erik
  • 정렬은 이미 다른 이유로 여러 가지 이유로 수행되었을 수 있습니다. 예를 들어 init에서 정렬되고 변경되지 않을 수 있습니다. 검색 시간 자체 테스트에 사용됩니다. 그러나 이것이 떨어지는 곳은 마이크로 벤치마킹의 별의 예가되는 것이 아닙니다. Microbenchmarks는 Java에서 올바르게 작동하는 것으로 유명한데 예를 들어 실제 테스트를 실행하기 전에 핫스팟 최적화를 수행 할 수 있도록 테스트 코드를 실행해야합니다. 실제 테스트 코드는 타이머로 한 번 이상 실행하지 않아야합니다.예제 함정 - Thor84no
  • 이 테스트는 3 가지 테스트를 모두 실행하기 때문에 결함이 있습니다.같은JVM 인스턴스. 나중의 테스트는 캐시, JIT 등을 워밍업하는 초기 테스트의 이점을 얻을 수 있습니다. - Steve Kuo
  • 이 테스트는 실제로 완전히 무관합니다. 정렬 (& 검색은 선형 (n * log (n)) 복잡도이며 이진 검색은 대수적이며 ArrayUtils.contains는 분명히 선형입니다. 이 솔루션을 완전히 다른 복잡성 등급으로 비교할 수는 없습니다. - dragn

30

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


  • 프리미엄 전문화에 주목할 가치가 있습니다. - skiwi
  • 또한 추가하려면,anyMatchJavaDoc은 그것을"...May not evaluate the predicate on all elements if not necessary for determining the result."따라서 일치 항목을 찾은 후에 처리를 계속할 필요가 없습니다. - mkobit

29

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

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

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


24

당신은배열 클래스값에 대한 2 진 검색을 수행합니다. 배열이 정렬되지 않은 경우 동일한 클래스의 정렬 함수를 사용하여 배열을 정렬 한 다음 검색해야합니다.


  • 동일한 클래스의 정렬 함수를 사용하여이를 수행 할 수 있습니다 ... 나는이를 내 대답에 추가해야합니다. - Thomas Owens
  • 아마도 asList (). contains () 접근보다 더 많은 비용을 지불하게 될 것입니다. 이 검사를 자주 수행해야하는 경우가 아니라면 (단 순차적으로 정렬 할 수있는 고정 값 목록 일 경우). - Joey
  • 참된. 어떤 변수가 가장 효과적 일지에 대한 많은 변수가 있습니다. 그래도 옵션이있는 것이 좋습니다. - Thomas Owens
  • 어떻게 할 수 있는지 알려주세요. - AHH
  • 이 작업을 수행하는 일부 코드는 다음과 같습니다.stackoverflow.com/a/48242328/9131078 - O.O.Balance

15

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

enum Values {
    AB, BC, CD, AE
}

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


  • 예외 던지기는 분명히 무거워 보이지만 작동하는 경우 값을 테스트하는 참신한 방법 일 것입니다. 단점은 열거 형을 미리 정의해야한다는 것입니다. - James P.

11

실제로 Tom Hawtin이 제안한 HashSet을 사용하면 정렬에 대해 걱정할 필요가 없으며 사전 정렬 된 배열에서 Binary Search와 속도가 동일 할 수도 있습니다.

그것은 모두 당신의 코드가 어떻게 설정되었는지에 달려 있습니다. 그러나 내가 서있는 곳에서부터 순서는 다음과 같습니다.

정렬되지 않은 배열에서 :

  1. HashSet
  2. asList
  3. 정렬 (& 이진

정렬 된 배열에서 :

  1. HashSet
  2. 이진
  3. asList

그래서 어느 쪽이든, HashSet ftw


  • HashSet 멤버쉽은 O (1)이고 정렬 된 컬렉션의 바이너리 검색은 O (log n)이어야합니다. - Skylar Saveland

9

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

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

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


7

가능한 한 가지 해결책 :

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


6

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

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;

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


5

에서Java 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);



4

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

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

의례Programcreek


  • 배열에 타겟 값 이전에 null 참조가 포함되어 있으면 null 포인터 예외가 발생합니다. - Samuel Edwin Ward
  • if 문은 다음과 같아야합니다. if (targetValue.equals (s)) String equals에 instanceof checker가 있으므로. - WIll

3

  1. 길이가 제한된 배열의 경우 다음을 사용합니다 (Camickr). 이는 반복 검사, 특히 긴 배열 (선형 검색)의 경우 느립니다.

     Arrays.asList(...).contains(...)
    
  2. 보다 큰 요소 집합에 대해 반복적으로 검사하는 경우 빠른 성능을 위해

    • 배열이 잘못된 구조입니다. 사용TreeSet각 요소를 추가하십시오. 요소를 정렬하고 빠릅니다.exist()메소드 (2 진 검색).

    • 요소가 구현하는 경우Comparable& 너는TreeSet그에 따라 정렬 :

      ElementClass.compareTo()메소드는 다음과 호환 가능해야합니다.ElementClass.equals():보기Triads가 싸우지 않는가? (자바 세트 항목 누락)

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


  • 왜 신경 쓰지?TreeSet?HashSet(O (1)) 빠르며 주문이 필요하지 않습니다. - Sean Owen

2

이것을 확인하십시오.

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


  • 덜 효과적이긴하지만 여전히 작동합니다. - CrazedCoder
  • 작동하지 않습니다.else...에 대한...마다(해당 배열에서 " AB "를 (를) 찾으려는 경우 값 중 3 개가 'AB'가 아니므로 3 번 반복됩니다). - Dukeling

2

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

1

용도Array.BinarySearch(array,obj)지정된 객체를 배열로 찾는 지 여부. 전의:

if (Array.BinarySearch(str, i) > -1)-> 참 - 존재

거짓 - 없음


  • 이 작업을 수행하려면 배열을 정렬해야합니다. - Erik
  • 또한 Array.FindIndex (배열, obj) ... 정보 Anywayz 주셔서 감사합니다 - Avenger
  • Array.BinarySearchArray.FindIndex.NET 메소드이며 Java에서는 존재하지 않습니다. - ataylor
  • @ataylor 거기에 자바의 Arrays.binarySearch. 하지만 당신이 옳아 요, 아니요 Arrays.findIndex - mente

1

이 시도:

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


1

나는이 토론에 참여하기가 너무 늦었지만이 문제를 해결하기위한 나의 접근 방식은 몇 년 전에 직면했을 때 이미 여기에 게시 된 다른 답변 들과는 조금 달랐다. 그 당시 내가 사용했던 해결책을 게시하고있다. 누군가가 유용하다고 여기는 경우에 여기에서 : (Thecontains()방법은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(), 다른 장소에서도 사용되었습니다.


1

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

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


-2

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

연결된 질문


관련된 질문

최근 질문