JavaRush /Java blogi /Random-UZ /Kofe tanaffusi №156. Java'da Arrays.binarySearch() usulid...

Kofe tanaffusi №156. Java'da Arrays.binarySearch() usulidan qanday foydalanish kerak

Guruhda nashr etilgan
Manba: FreeCodeCamp Ushbu maqola orqali siz Java-da Arrays.binarySearch() usulidan qanday foydalanishni bilib olasiz. Kofe tanaffusi №156.  Java-da Arrays.binarySearch() usulidan qanday foydalanish kerak - 1

Java-da Arrays.binarySearch() nima?

Arrays.binarySearch() usuli uchun rasmiy hujjatlarda aytilishicha:
  • Bu usul ikkilik qidiruv algoritmi yordamida belgilangan bayt massivida belgilangan qiymatni qidiradi.
  • Qo'ng'iroq qilishdan oldin massiv tartiblangan bo'lishi kerak ( sort(bayt[]) usuli yordamida). Agar tartiblashtirilmasa, natijalar aniqlanmaydi.
  • Agar massiv belgilangan qiymatga ega bir nechta elementlarni o'z ichiga olsa, qaysi biri topilishiga kafolat yo'q.
Oddiy qilib aytganda, Arrays.binarySearch() usuli tartiblangan massivda berilgan elementni izlashi va topilsa uning indeksini qaytarishi mumkin.
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() usuli birinchi argument sifatida siz qidirmoqchi bo'lgan massivni va ikkinchi argument sifatida siz izlayotgan kalitni oladi. Yuqoridagi dasturning natijasi quyidagicha bo'ladi:
Berilgan unli indeksda: 2
Esda tutingki, usul elementning o'zini emas, balki topilgan elementning indeksini qaytaradi. Shunday qilib, indeksni ushbu misolda ishlatilgan kabi butun son sifatida saqlashingiz mumkin. Odatiy bo'lib, usul qidiruvning boshlang'ich nuqtasi sifatida massivning birinchi indeksini va qidiruvning yakuniy nuqtasi sifatida massiv uzunligini ishlatadi. Bunday holda, boshlang'ich indeks 0, tugash indeksi esa 6. Standart boshlang'ich va tugatish indeksini ishlatish o'rniga, ularni o'zingiz belgilashingiz mumkin. Misol uchun, agar siz indeks 2 dan 4 indeksgacha qidirishni xohlasangiz, buni shunday qilishingiz mumkin:
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);

	}
}
Bu holda Arrays.binarySearch() usuli siz qidirmoqchi bo'lgan massivni birinchi argument sifatida, boshlang'ich indeksni ikkinchi argument sifatida, tugatish indeksini uchinchi va kalitni to'rtinchi argument sifatida oladi. Tugash indeksini massiv uzunligida saqlasangiz, usul yaxshi ishlashi kerak. Ammo agar siz undan oshib ketsangiz, istisnolardan tashqari qator indeksini olasiz . Bu juda oddiy, to'g'rimi? Usul topilsa, element indeksini qaytaradi. Ammo agar u berilgan elementni topmasa nima bo'ladi?

Arrays.binarySearch() berilgan elementni topa olmasa nima bo'ladi?

Keling, Arrays.binarySearch() usuli uchun rasmiy hujjatlarni yana bir bor ko'rib chiqaylik :
  • Usul, agar u massivda belgilangan diapazonda bo'lsa, qidiruv natijalarida kalit indeksini topadi; aks holda biz (-(qo'shish nuqtasi) - 1) olamiz .
  • Qo'shish nuqtasi massivga kalit kiritiladigan nuqta sifatida aniqlanadi: diapazondagi birinchi element indeksi kalitdan kattaroq yoki diapazondagi barcha elementlar qiymatdan kichik bo'lsa, toIndex (oxirgi indeks). belgilangan kalit.
  • Qaytish qiymati faqat kalit topilganda 0 dan katta yoki teng bo'lishini unutmang.
Juda aniq emas, to'g'rimi? Birinchi qatorda, agar u massivda topilsa, usul qidiruvdan kalit indeksini qaytarishini bildiradi. Agar u topilmasa, u holda chiqish qiymatga teng bo'ladi (-(qo'shish nuqtasi) - 1) . Qidiruv kalitiga qarab, qo'shish nuqtasi turli xil ma'noga ega bo'lishi mumkin. Aytaylik, bizda massiv [5, 6, 7, 8, 9, 10] va 0 qidiruv kaliti bor , bu massivda aniq emas. Bunday holda, qidiruv kaliti massivning barcha elementlaridan kamroq bo'ladi. Lekin qidiruv kalitidan kattaroq bo'lgan birinchi element 5 dir . Shunday qilib, bizning holatlarimizda kiritish nuqtasi bo'ladi:
(-(qidiruv kalitidan kattaroq birinchi element indeksi) - 1) = (0 - 1) = -1
Buni quyidagi kod snippetida amalga oshirishingiz mumkin:
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
	}
}
Yana faraz qilaylik, bizda massiv [5, 6, 7, 8, 9, 10] va 12 qidiruv kaliti bor , bu massivda aniq emas. Bunday holda, qidiruv kaliti massivning barcha elementlaridan kattaroqdir. Bu erda kiritish nuqtasi quyidagicha bo'ladi:
(-(oxirgi indeks (-(6) - 1) = (-6 - 1) = -7)
Esda tutingki, agar siz tugatish indeksini qo'lda belgilamasangiz, usul yakuniy indeks sifatida massiv uzunligidan foydalanadi, bu holda bu 6 ga teng . Buni quyidagi kod snippetida amalga oshirishingiz mumkin:
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
	}
}
Biroq, agar siz boshlang'ich va tugatish indekslarini qo'lda aniqlasangiz, natijalar o'zgaradi:
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

	}
}
Qiymatlarni o'zingiz hisoblashga harakat qiling. Arrays.binarySearch() usulidan quyidagi belgilar bilan ham foydalanishingiz mumkin :
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));

	}
}
Belgilangan qidiruv kaliti topilmasa, xuddi shu printsiplar qo'llaniladi. Ammo massivdagi belgi va berilgan qidiruv kaliti o'rtasida taqqoslashda tegishli belgining ASCII kodi ishlatiladi. Ya'ni, A (65) a (97) dan kichik bo'ladi . Dasturingiz natijalarini o'zaro tekshirishda buni hisobga oling.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION