JavaRush /Java Blog /Random-KO /커피 브레이크 #156. Java에서 Arrays.binarySearch() 메서드를 사용하는 방법

커피 브레이크 #156. Java에서 Arrays.binarySearch() 메서드를 사용하는 방법

Random-KO 그룹에 게시되었습니다
출처: FreeCodeCamp 이 기사에서는 Java에서 Arrays.binarySearch() 메서드를 사용하는 방법을 배웁니다. 커피 브레이크 #156.  Java에서 Arrays.binarySearch() 메소드를 사용하는 방법 - 1

Java의 Arrays.binarySearch()는 무엇입니까?

Arrays.binarySearch() 메서드 에 대한 공식 문서에는 다음과 같이 나와 있습니다.
  • 이 메서드는 이진 검색 알고리즘을 사용하여 지정된 바이트 배열에서 지정된 값을 검색합니다.
  • 호출이 이루어지기 전에 배열을 정렬해야 합니다( sort(byte[]) 메서드 사용). 정렬되지 않으면 결과가 결정되지 않습니다.
  • 배열에 지정된 값을 가진 여러 요소가 포함된 경우 어떤 요소가 발견될지 보장할 수 없습니다.
간단히 말해서 Arrays.binarySearch() 메서드 는 정렬된 배열에서 지정된 요소를 검색하고 해당 요소가 있으면 해당 인덱스를 반환할 수 있습니다.
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';

		int foundItemIndex = Arrays.binarySearch(vowels, key);

		System.out.println("The given vowel is at index: " + foundItemIndex);

	}
}
Arrays.binarySearch() 메서드는 검색하려는 배열을 첫 번째 인수로, 검색하려는 키를 두 번째 인수로 사용합니다. 위 프로그램의 출력은 다음과 같습니다.
주어진 모음은 색인: 2에 있습니다.
이 메서드는 요소 자체가 아니라 발견된 요소의 인덱스를 반환한다는 점을 기억하세요. 이렇게 하면 이 예제에서 사용된 것과 같은 정수로 인덱스를 저장할 수 있습니다. 기본적으로 이 메서드는 배열의 첫 번째 인덱스를 검색 시작점으로 사용하고 배열 길이를 검색 끝점으로 사용합니다. 이 경우 시작 인덱스는 0이고 끝 인덱스는 6입니다. 기본 시작 인덱스와 끝 인덱스를 사용하는 대신 직접 정의할 수 있습니다. 예를 들어, 인덱스 2부터 인덱스 4까지 검색하려면 다음과 같이 할 수 있습니다.
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';
		int startIndex = 2;
		int endIndex = 4;

		int foundItemIndex = Arrays.binarySearch(vowels, startIndex, endIndex, key);

		System.out.println("The given vowel is at index: " + foundItemIndex);

	}
}
이 경우 Arrays.binarySearch() 메서드 는 검색하려는 배열을 첫 번째 인수로, 시작 인덱스를 두 번째 인수로, 종료 인덱스를 세 번째, 키를 네 번째 인수로 사용합니다. 배열 길이 내에서 끝 인덱스를 유지하는 한 메서드는 제대로 작동합니다. 그러나 이를 초과하면 Array index out of range 예외가 발생합니다 . 꽤 간단하죠? 이 메서드는 요소가 발견되면 해당 요소의 인덱스를 반환합니다. 하지만 주어진 요소를 찾지 못하면 어떻게 될까요?

Arrays.binarySearch()가 특정 요소를 찾지 못하면 어떻게 되나요?

Arrays.binarySearch() 메서드 에 대한 공식 문서를 다시 살펴보겠습니다 .
  • 이 메소드는 지정된 범위 내의 배열에 키가 포함된 경우 검색 결과에서 키의 인덱스를 찾습니다. 그렇지 않으면 (-(insertion point) - 1) 을 얻습니다 .
  • 삽입 지점은 키가 배열에 삽입되는 지점으로 정의됩니다. 범위에 있는 첫 번째 요소의 인덱스는 키보다 크거나 범위에 있는 모든 요소가 키보다 작은 경우 toIndex(끝 인덱스)입니다. 지정된 키.
  • 키가 발견되면 반환 값은 0보다 크거나 같습니다.
별로 명확하지 않습니까? 첫 번째 줄에는 해당 메서드가 배열에서 키가 발견되면 검색에서 키 인덱스를 반환한다는 내용이 나와 있습니다. 찾지 못한 경우 출력은 (-(삽입 지점) - 1) 값과 동일합니다 . 검색 키에 따라 삽입 지점의 의미가 달라질 수 있습니다. [5, 6, 7, 8, 9, 10] 배열이 있고 검색 키가 0 인데 배열에 분명히 존재하지 않는다고 가정해 보겠습니다. 이 경우 검색 키는 배열의 모든 요소보다 작습니다. 그러나 검색 키보다 큰 첫 번째 요소는 5 입니다 . 따라서 우리의 경우 삽입 지점은 다음과 같습니다.
(-(검색 키보다 큰 첫 번째 요소의 인덱스) - 1) = (0 - 1) = -1
다음과 같은 코드 조각으로 이를 구현할 수 있습니다.
package arrays;

import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		System.out.println(Arrays.binarySearch(numbers, 0)); // -1
	}
}
배열 [5, 6, 7, 8, 9, 10] 과 검색 키 12 가 있는데 배열에 분명히 존재하지 않는다고 다시 가정해 보겠습니다. 이 경우 검색 키는 배열의 모든 요소보다 큽니다. 여기서 삽입 지점은 다음과 같습니다.
(-(종료 지수 (-(6) - 1) = (-6 - 1) = -7
종료 인덱스를 수동으로 지정하지 않으면 메서드는 배열의 길이를 종료 인덱스(이 경우 6 ) 로 사용한다는 점을 기억하세요 . 다음과 같은 코드 조각으로 이를 구현할 수 있습니다.
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		System.out.println(Arrays.binarySearch(numbers, 12)); // -7
	}
}
그러나 시작 및 끝 인덱스를 수동으로 정의하면 결과가 변경됩니다.
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		int startIndex = 1;
		int endIndex = 3;

		System.out.println(Arrays.binarySearch(numbers, startIndex, endIndex, 5)); // -2
		System.out.println(Arrays.binarySearch(numbers, startIndex, endIndex, 10)); // -4

	}
}
직접 값을 계산해 보세요. 다음과 같은 기호와 함께 Arrays.binarySearch() 메서드를 사용할 수도 있습니다 .
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';
		int startIndex = 2;
		int endIndex = 4;

		System.out.println(Arrays.binarySearch(vowels, startIndex, endIndex, key));

	}
}
지정된 검색 키를 찾을 수 없는 경우에도 동일한 원칙이 적용됩니다. 그러나 배열의 문자와 주어진 검색 키를 비교할 때는 해당 문자의 ASCII 코드가 사용됩니다. 즉, A(65)는 a(97) 보다 작습니다 . 프로그램의 출력을 교차 확인할 때 이 점을 고려하십시오.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION