Java의 Array indexOf는 어디에 있습니까?


198

나는 매우 명백한 것을 놓치고 있어야하지만, 모든 것을 검색 했으며이 방법을 찾을 수 없습니다.

답변:


234

Arrays유틸리티 클래스를 사용하여이를 수행하는 몇 가지 방법이 있습니다.

배열이 정렬 되지 않고 기본 요소의 배열 이 아닌 경우 :

java.util.Arrays.asList(theArray).indexOf(o)

배열 프리미티브이고 정렬되지 않은 경우 Kerem Baydoğan , Andrew McKinlay 또는 Mishax 와 같은 다른 답변 중 하나가 제공하는 솔루션을 사용해야합니다 . 위의 코드 theArray는 원시적 인 경우에도 컴파일 되지만 (경고 발생 가능성이 있음) 그럼에도 불구하고 완전히 잘못된 결과를 얻을 수 있습니다.

배열이 정렬되면 성능을 위해 이진 검색을 사용할 수 있습니다.

java.util.Arrays.binarySearch(theArray, o)

3
이 답변이 적어도 Java 1.6에서는 틀린 것 같습니다. download.oracle.com/javase/6/docs/api/java/util/… asList는 인수 목록을 인수 자체가 아닌 목록으로 변환합니다.
Alexandru

11
@Alexandru Ellipsis 처리는 구문 설탕입니다. 인수가 typed T...인 경우 인수 의 실제 런타임 유형은입니다. T[]0 개 이상의 매개 변수 유형 T을 전달하면 새로 구성된 배열에 랩핑되어 전달됩니다. 전달되는 매개 변수가 이미 유형 T[]인 경우 구문 설탕이 무시됩니다.
Jeffrey Hantin

7
너의 의도를 알 겠어. 솔루션 ( .indexOf)은 기본 요소에는 유효하지 않습니다.
Alexandru

53
아무도 언급하지 않았으므로 Arrays.asList는 이미 존재하는 배열을 백업으로 사용합니다. (즉 복사본이 생성되는 대한 염려가 없습니다.)
여호수아 골드버그

4
@Notinlist 자바 사람들도 그렇게 생각했습니다. Arrays.toList(list).sublist(from,to).indexOf(o)범위 내에서 요소를 검색하는 데 사용 합니다 [from, to).
마리오 카네이로

62

배열에는 indexOf()메소드 가 없습니다 .

아마이 Apache Commons Lang ArrayUtils방법은 당신이 찾고있는 것입니다.

import org.apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");

Eclipse가이 가져 오기 라이브러리를 찾을 수 없습니다.
Omore

21

기본형의 경우 복싱을 피하려면 Guava 에 기본형 배열에 대한 도우미가 있습니다 (예 : Ints.indexOf (int [] array, int target)).


다른 솔루션은 모두 새로운 문자열이나 목록을 만들거나 단일 요소를 처리합니다. Guava의 Chars.indexOf를 사용하면 배열의 배열 색인을 얻을 수 있습니다. 이것이 올바른 해결책입니다.
HappyEngineer

18

없습니다. java.util.List*를 사용 하거나 직접 작성할 수 있습니다 indexOf().

public static <T> int indexOf(T needle, T[] haystack)
{
    for (int i=0; i<haystack.length; i++)
    {
        if (haystack[i] != null && haystack[i].equals(needle)
            || needle == null && haystack[i] == null) return i;
    }

    return -1;
}

* 당신은 사용하여 배열에서 하나를 만들 수 있습니다 Arrays#asList()


2
사용 T은 잘못된 것입니다. 그것은 타입 안전을 제공하지 않으며, 실수하기 쉽다. 타입 안전하다 ... 더 나은 사용 Object
Venkata Raju

4
@VenkataRaju, 여기서 T를 사용하면 두 메소드 매개 변수가 모두 같은 유형이됩니다. 유용합니다.
생식선

5
@gonadarian 아닙니다. 이 두 가지 모두 잘 컴파일됩니다 : indexOf("str", new Object[] {});,indexOf(new Object(), new String[] {});
Venkata Raju

1
@VenkataRaju 그렇습니다. String은 Object이기 때문에 예제에서 아무것도 입증하지 못합니다. 그래서 Object 배열에는 색인을 찾으려는 String이 포함될 수 있습니다.

1
@ ghert85 다른 예 : indexOf("str", new Date[] {}),indexOf(new Date(), new String[] {})
Venkata Raju

15

C #에서와 달리 당신은이 곳 사항 Array.indexOf의 방법을, 그리고 당신은이 자바 스크립트 같이 IndexOf의 방법은 자바의 API합니다 ( Array그리고 Arrays특히 클래스) 그런 방법이 없습니다.

이 메소드 indexOf (보완 자 lastIndexOf와 함께)는 java.util.List 인터페이스에 정의되어 있습니다. indexOf 및 lastIndexOf는 오버로드되지 않으며 Object를 매개 변수로만 사용합니다.

배열이 정렬 된 경우 Arrays 클래스는 binarySearch 메서드의 오버로드를 정의하여 O (n 대신 가능한 최고의 성능 (O (log n)으로 찾고있는 요소의 인덱스를 찾을 수 있음)을 정의하기 때문에 운이 좋았습니다. ), 후자는 indexOf)에 의해 수행 된 순차적 검색에서 기대할 수있는 것입니다. 다음 네 가지 고려 사항이 있습니다.

  1. 배열은 자연 순서로 또는 인수로 제공 한 Comparator의 순서로 정렬되어야합니다. 또는 키보다 "낮은"요소는 배열에서 해당 요소 앞에 와야합니다. 키가 배열에서 해당 요소 다음에 와야하는 "보다 큼"

  2. 일반적으로 indexOf를 사용하여 키가 배열에 있는지 여부를 판별하는 테스트 (반환 값이 -1이 아닌지 확인)는 binarySearch를 보유하지 않습니다. 리턴 된 값은 키가 존재하지 않지만 존재했을 경우 예상되는 인덱스를 나타내므로 리턴 값이 0보다 작은 지 검증해야합니다.

  3. 배열에 키와 동일한 여러 요소가 포함 된 경우 binarySearch에서 얻은 내용은 정의되지 않습니다. 이것은 첫 번째 발생을 리턴하는 indexOf와 마지막 발생을 리턴하는 lastIndexOf와 다릅니다.

  4. 부울 배열은 먼저 모든 거짓을 포함하고 모든 참을 포함하는 경우 정렬 된 것처럼 보일 수 있지만 계산되지 않습니다. 부울 배열을 허용하는 binarySearch 메소드를 대체하지 않으며 배열에서 첫 번째 true가 나타나는 위치를 감지 할 때 O (log n) 성능을 원하면 영리한 무언가를 수행해야합니다. 부울 및 상수 Boolean.FALSE 및 Boolean.TRUE.

배열이 프리미티브 유형이 아닌 정렬되지 않은 경우 java.util.Arrays 의 asList 메소드를 호출하여 List의 indexOf 및 lastIndexOf 메소드를 사용할 수 있습니다 . 이 메소드는 배열 주위에 AbstractList 인터페이스 래퍼를 리턴합니다. 배열의 복사본을 만들지 않기 때문에 최소한의 오버 헤드가 필요합니다. 언급했듯이,이 방법은 오버로드되지 않으므로 참조 유형의 배열에서만 작동합니다.

배열이 정렬되지 않고 배열 유형 원시적 이라면 Java API를 사용하는 것이 좋지 않습니다 . for 루프 또는 정적 유틸리티 메소드를 작성하십시오.이 메소드는 오브젝트 인스턴스화의 일부 오버 헤드를 포함하는 asList 방식에 비해 성능상의 이점이 있습니다. 배열의 모든 요소를 ​​반복하는 무차별 강제 실행 루프를 작성하는 것이 훌륭한 해결책이 아니라고 생각하는 경우 indexOf를 호출 할 때 Java API가 수행하는 것과 정확히 일치한다는 점을 받아들입니다. 다음과 같이 만들 수 있습니다.

public static int indexOfIntArray(int[] array, int key) {
    int returnvalue = -1;
    for (int i = 0; i < array.length; ++i) {
        if (key == array[i]) {
            returnvalue = i;
            break;
        }
    }
    return returnvalue;
}

여기에 자신 만의 메소드를 작성하지 않으려면 Guava와 같은 개발 프레임 워크에서 메소드를 사용하십시오. 거기에서 indexOflastIndexOf 의 구현을 찾을 수 있습니다 .


11

Java ArrayList에는 indexOf메소드가 있습니다. Java 배열에는 그러한 방법이 없습니다.


26
다만 ArrayList- 모든 자바 List있다 indexOf().
매트 볼

6

직접 코딩하는 것 이외의 배열에서 "indexOf"를 기억하지는 않지만 배열에 기본 유형이 포함되어 있으면 많은 java.util.Arrays#binarySearch(...)메소드 중 하나를 사용할 수 있습니다 ( 배열 javadoc 참조 ).


5

List 인터페이스에는 indexOf () 메소드가 있으며 Array의 asList () 메소드를 사용하여 배열에서 List를 얻을 수 있습니다. 그 외에 Array 자체에는 그러한 방법이 없습니다. 정렬 된 배열에 대한 binarySearch () 메소드가 있습니다.


4

배열 자체에는 해당 방법이 없습니다. 목록은, 그러나, 수행합니다 같이 IndexOf를


2
다만 ArrayList- 모든 자바 List있다 indexOf().
매트 볼

예, 방금 OP가 찾고있는 것에 가장 가까운 것이기 때문에 ArrayList를 지정했습니다.
Igor


2

Java 배열에는 직접적인 indexOf 함수가 없습니다.


0

제프리 한틴 의 대답은 좋지만 이것이 그렇게하거나 그렇지 않으면 제약이 있습니다 ...

자체 확장 방법을 작성할 수 있으며 항상 원하는 방식으로 작동합니다.

Lists.indexOf(array, x -> item == x); // compare in the way you want

그리고 여기 당신의 확장이 있습니다

public final class Lists {
    private Lists() {
    }

    public static <T> int indexOf(T[] array, Predicate<T> predicate) {
        for (int i = 0; i < array.length; i++) {
            if (predicate.test(array[i])) return i;
        }
        return -1;
    }

    public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
        for (int i = 0; i < list.size(); i++) {
            if (predicate.test(list.get(i))) return i;
        }
        return -1;
    }

    public interface Predicate<T> {
        boolean test(T t);
    }
}

-4
int findIndex(int myElement, int[] someArray){
 int index = 0;
 for(int n: someArray){
   if(myElement == n) return index;
   else index++;
 }
}

참고 :이 방법은 int 유형의 배열에 사용할 수 있으며 약간의 변경 사항이있는 다른 유형 에도이 알고리즘을 사용할 수 있습니다


1
-1 : 먼저 원래 배열을 정렬하여 원치 않는 정렬합니다. 둘째, 원래 배열이 아닌 정렬 된 배열에 대한 응답을 제공합니다 (우리가 원하는 정렬 된 배열을 원한다면 이미 정렬되었을 것입니다). 셋째, 정렬이 O (n log n)이므로 배열을 선형으로 통과하는 것보다 느립니다. 따라서이 대답은 잘못되고 비효율적입니다.
Jamie

전체 정렬이 사용될 때 원래 색인이 유실되었습니다.
Downhillski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.