int 배열에서 요소의 인덱스를 찾는 방법은 무엇입니까?


81

Java 배열 유형에서 특정 값의 색인을 어떻게 찾을 수 int있습니까?

Arrays.binarySearch정렬되지 않은 배열을 사용해 보았지만 때로는 정답 만 제공합니다.


13
이진 검색은 정렬되지 않은 배열에서 작동하지 않습니다.
Chris Eberle

그럼 제게 뭔가를 제안 해 주실 수 있나요? 어떻게해야하나요? 배열을 정렬하면 인덱스 트랙이 손실되고 값이 어떤 인덱스에서 왔는지 알아야하기 때문입니까 ??
Jeomark

편집 : 추가하는 것을 잊었습니다. 배열 인덱스도 찾아야합니다.
Jeomark

1
배열을 정렬하지 않으려면 간단한 for 루프를 사용하여 값을 찾으십시오.
Jamie Curtis

2
이 기능의 문서를 읽고 :)에서 일반적으로 좋은 binarySearch:. "검색의 ... 지정된 배열을 바이너리 서치 알고리즘을 사용해, 지정된 값 의 배열을 정렬해야 이전 (정렬 (긴 []) 메소드에 의해로) 이 호출을합니다. 이 정렬되지 않은 경우, 그 결과가 정의되어있다. ... "

답변:


133
Integer[] array = {1,2,3,4,5,6};

Arrays.asList(array).indexOf(4);

이 솔루션은 List 유형의 새 개체를 만들기 때문에 스레드로부터 안전합니다.

또한 매번 새로운 객체를 생성 할 것이기 때문에 루프 또는 이와 유사한 방식으로 이것을 호출하고 싶지 않습니다.


고마워하지만 더블 타입에서도 작동할까요? 질문에서 언급하는 것을 잊었 어 미안하지만 이중 값에 대해서도 작업해야합니다. 하지만 int에서는 잘 작동합니다.
Jeomark

그렇습니다. 아무것도 변경할 필요가 없습니다 (하지만 분명히 배열 유형)
Pablo Fernandez

54
실제로 코드가 작동하지 않습니다. indexOf가 객체를 찾지 못하는 이유를
teloon

14
배열을 int [] 대신 Integer []로 변환해야합니다. 기본 배열은 자동 박싱되지 않습니다.
Leon Helmsley 2013 년

1
정말 스레드 세이프인가요? 소스를 클릭하면 List.asList ()는 int 배열을 데이터 컨테이너 (복사 아님)로 직접 취하는 ArrayList를 생성합니다.
Langusten Gustel

26

Guava 컬렉션을 사용하는 경우 또 다른 옵션은 Ints.indexOf입니다.

// Perfect storm:
final int needle = 42;
final int[] haystack = [1, 2, 3, 42];

// Spoiler alert: index == 3
final int index = Ints.indexOf(haystack, needle);

공간, 시간 및 코드 재사용이 중요한 경우에 좋은 선택입니다. 또한 매우 간결합니다.


20

API를 살펴보면 먼저 배열을 정렬해야한다고 말합니다.

그래서:

Arrays.sort(array);
Arrays.binarySearch(array, value);

배열을 정렬하지 않으려면 :

public int find(double[] array, double value) {
    for(int i=0; i<array.length; i++) 
         if(array[i] == value)
             return i;
}

7
+1 그러나 입력 을 Arrays.sort 변경 하고 원래 배열이 수정 된다는 점에 유의해야합니다 .

감사합니다. 두 번째 방법은 다른 인덱스를 가진 중복 값에 대한 논리를 추가 한 후 어떻게 든 저에게 효과적이었습니다.
Jeomark

14

이 메서드를 클래스에 복사

 public int getArrayIndex(int[] arr,int value) {

        int k=0;
        for(int i=0;i<arr.length;i++){

            if(arr[i]==value){
                k=i;
                break;
            }
        }
    return k;
}

두 개의 perameters Array 및 value를 전달하여이 메서드를 호출하고 반환 값을 정수 변수에 저장합니다.

int indexNum = getArrayIndex(array,value);

감사합니다


6
ArrayUtils.indexOf(array, value);
Ints.indexOf(array, value);
Arrays.asList(array).indexOf(value);

3
이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 아마도 더 많은 찬성 투표를 받게됩니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
이중 경고음

4

최신 Java를 사용하여이 문제를 해결할 수 있습니다. 아래 코드를 사용하십시오.

static int findIndexOf(int V, int[] arr) {
        return IntStream.range(1, arr.length).filter(i->arr[i]==V).findFirst().getAsInt();
    }

큰! 공유해 주셔서 감사합니다. 언어 기능 컨텍스트 내에서 새로운 (최적화 된) 기본 제공 솔루션에 대해 배우는 데 도움이됩니다.
Guillermo Garcia


3

이진 검색을 사용하기 전에 값을 정렬해야합니다. 그렇지 않으면 수동 방법은 탭의 모든 int를 시도하는 것입니다.

public int getIndexOf( int toSearch, int[] tab )
{
  for( int i=0; i< tab.length ; i ++ )
    if( tab[ i ] == toSearch)
     return i;

  return -1;
}//met

대체 방법은 맵의 각 값에 대한 모든 인덱스를 매핑하는 것입니다.

tab[ index ] = value;
if( map.get( value) == null || map.get( value) > index )
    map.put( value, index );

그런 다음 map.get (value)를 사용하여 색인을 가져옵니다.

감사합니다, Stéphane

@pst, 귀하의 의견에 감사드립니다. 다른 대체 방법을 게시 할 수 있습니까?


이것은 한 가지 방법입니다. 그러나 이것이 유일한 방법 은 아닙니다 . 여기서 부울 변수의 사용 found은 쓸모없고 (사용되지도 않음) 제거해야합니다. 그러나 "수동 루프 방법"을 표시하는 +1 (스타일 및 서식 문제는 제외).

2

단순한:

public int getArrayIndex(int[] arr,int value) {
    for(int i=0;i<arr.length;i++)
        if(arr[i]==value) return i;
    return -1;
}

2
    Integer[] arr = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
    List<Integer> arrlst = Arrays.asList(arr);
    System.out.println(arrlst.lastIndexOf(1));

배열은 int []가 아니라 Integer [] 여야합니다. 적어도 indexOf ()는 Integer에서만 작동합니다
djdance

1

누군가가 여전히 답을 찾고 있다면-

  1. [Apache Commons Library] [1]에서 ArrayUtils.indexOf ()를 사용할 수 있습니다.

  2. Java 8을 사용하는 경우 Strean API를 사용할 수도 있습니다.

    public static int indexOf(int[] array, int valueToFind) {
        if (array == null) {
            return -1;
        }
        return IntStream.range(0, array.length)
                .filter(i -> valueToFind == array[i])
                .findFirst()
                .orElse(-1);
    }
    

    [1] : https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/ArrayUtils.html#indexOf(int[],%20int)


1

가장 쉬운 방법은 반복하는 것입니다. 예를 들어 배열의 최소값을 찾으려고합니다.

public static Pair<Integer, Integer> getMinimumAndIndex(int[] array) {
        int min = array[0];
        int index = 0;
        for (int i = 1; i < array.length; i++) {
            if (array[i] < min) {
                min = array[i];
                index = i;
            }

            return new Pair<min, index>;

이렇게하면 모든 배열 값을 테스트하고 그중 일부가 최소값이면 최소값 인덱스도 알 수 있습니다. 일부 값을 검색하는 것과 동일하게 작동 할 수 있습니다.

public static int indexOfNumber(int[] array) {
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == 77) {        // here you pass some value for example 77
                index = i;
            }
        }
        return index;
    }

0

찾고있는 인덱스를 찾을 때까지 배열을 살펴 보거나 List대신 사용할 수 있습니다 . 를 사용하여 배열을 목록으로 변환 할 수 있습니다 asList().


0
/**
     * Method to get the index of the given item from the list
     * @param stringArray
     * @param name
     * @return index of the item if item exists else return -1
     */
    public static int getIndexOfItemInArray(String[] stringArray, String name) {
        if (stringArray != null && stringArray.length > 0) {
            ArrayList<String> list = new ArrayList<String>(Arrays.asList(stringArray));
            int index = list.indexOf(name);
            list.clear();
            return index;
        }
        return -1;
    }

clear과는 new ArrayList불필요한 작업이다. 새 할당은 이미 메서드 가있는을 반환 ArrayList하기 때문에 전체 배열을 복사합니다 . 목록의 사본을 지우는 것은 불필요하며 GC는 어쨌든 그것을 제거합니다. Arrays.asListListindexOf
TWiStErRob

0

다음과 같이 할 수 있습니다.

 public class Test {

public static int Tab[]  = {33,44,55,66,7,88,44,11,23,45,32,12,95};
public static int search = 23;

public static void main(String[] args) {
    long stop = 0;
    long time = 0;
    long start = 0;
    start = System.nanoTime();
    int index = getIndexOf(search,Tab);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("equal to took in nano seconds ="+time);
    System.out.println("Index  of searched value is: "+index);
    System.out.println("De value of Tab with searched index is: "+Tab[index]);
    System.out.println("==========================================================");
    start = System.nanoTime();
    int Bindex = bitSearch(search,Tab);
    stop = System.nanoTime();
    time = stop - start;
    System.out.println("Binary search took nano seconds ="+time);
    System.out.println("Index  of searched value is: "+Bindex);
    System.out.println("De value of Tab with searched index is: "+Tab[Bindex]);
}



public static int getIndexOf( int toSearch, int[] tab ){
     int i = 0;
     while(!(tab[i] == toSearch) )
     {  i++; }
       return i; // or return tab[i];
   }
public static int bitSearch(int toSearch, int[] tab){
    int i = 0;
    for(;(toSearch^tab[i])!=0;i++){
    }
    return i;

}

}

XOR 추가 :)


tab.equals(toSearch)배열을 int와 비교하고 있습니다. 어쩌면 tab[i] == toSearch대신.
Mike Samuel

마이크 감사합니다 ... Google 이진 검색, 멋진 기사 및 흥미로운 방법
Andre

: @Andre 당신은 그들에게 공평한 경쟁의 장 (동일한 순서로, 동일한 제어 흐름)을 얻었다 점을 증명하려고하는 경우 while (tab[i] != toSearch) i++;VS를 while ((tab[i] ^ toSearch) != 0) i++;.
TWiStErRob

1
나를 위해 어떤 경우에도 타이밍이 방법은 작동하지 않습니다 bitSearch항상보다 더 빨리이다 getIndexOf; 단순히 두 가지 방법으로 통화를 교환하는 경우 동안 getIndexOf보다 더 빨리 얻는다 bitSearch. 이것은 JVM 내부의 어떤 이유로 인해 두 번째 것이 항상 더 빠르다는 것을 분명히 보여줍니다. 실험을 여러 번 (아마도 수백만) 반복하고 값을 평균화하고 극단 값을 버리고 테스트와 매우 유사한 워밍업을 수행해야합니다.
TWiStErRob

0

for 루프를 사용하는 주요 방법에서 :-내 예제의 세 번째 for 루프가이 질문에 대한 답입니다. -제 예에서는 20 개의 임의의 정수 배열을 만들고 변수에 가장 작은 숫자를 할당하고 루프 수를 세는 동안 배열의 위치가 가장 작은 값에 도달하면 루프를 중지했습니다.

import java.util.Random;
public class scratch {
    public static void main(String[] args){
        Random rnd = new Random();
        int randomIntegers[] = new int[20];
        double smallest = randomIntegers[0];
        int location = 0;

        for(int i = 0; i < randomIntegers.length; i++){             // fills array with random integers
            randomIntegers[i] = rnd.nextInt(99) + 1;
            System.out.println(" --" + i + "-- " + randomIntegers[i]);
        }

        for (int i = 0; i < randomIntegers.length; i++){            // get the location of smallest number in the array 
            if(randomIntegers[i] < smallest){
                smallest = randomIntegers[i];                 
            }
        }

        for (int i = 0; i < randomIntegers.length; i++){                
            if(randomIntegers[i] == smallest){                      //break the loop when array location value == <smallest>
                break;
            }
            location ++;
        }
        System.out.println("location: " + location + "\nsmallest: " + smallest);
    }
}

코드는 모든 숫자와 해당 위치, 가장 작은 숫자 다음에 가장 작은 숫자의 위치를 ​​출력합니다.


0
static int[] getIndex(int[] data, int number) {
    int[] positions = new int[data.length];
    if (data.length > 0) {
        int counter = 0;
        for(int i =0; i < data.length; i++) {
            if(data[i] == number){
                positions[counter] = i;
                counter++;
            }
        }
    }
    return positions;
}

0

이진 검색 : 이진 검색은 배열에서 배열 요소의 인덱스를 찾는데도 사용할 수 있습니다. 그러나 이진 검색은 배열이 정렬 된 경우에만 사용할 수 있습니다. Java는 Java의 Arrays 라이브러리에서 찾을 수있는 내장 함수를 제공합니다.이 함수는 요소가 있으면 인덱스를 반환하고 그렇지 않으면 -1을 반환합니다. 복잡성은 O (log n)입니다. 다음은 이진 검색의 구현입니다.

public static int findIndex(int arr[], int t) { 
   int index = Arrays.binarySearch(arr, t); 
   return (index < 0) ? -1 : index; 
} 

-2
Integer[] array = {1, 2, 3, 4, 5, 6};

for (int i = 0; i < array.length; i++) {
    if (array[i] == 4) {
        system.out.println(i);
        break;
    }
}

3
중복 된 답변입니다.
betontalpfa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.