JavaRush /Java блогу /Random-KY /Кофе-брейк №156. Java'да Arrays.binarySearch() ыкмасын ка...

Кофе-брейк №156. Java'да Arrays.binarySearch() ыкмасын кантип колдонуу керек

Группада жарыяланган
Булак: FreeCodeCamp Бул макала менен сиз Java'да Arrays.binarySearch() ыкмасын кантип колдонууну үйрөнөсүз. Кофе-брейк №156.  Java тorнде Arrays.binarySearch() ыкмасын кантип колдонуу керек - 1

Javaдагы Arrays.binarySearch() деген эмне?

Arrays.binarySearch() методунун расмий documentтеринде мындай деп айтылат:
  • Бул ыкма экorк издөө алгоритмин колдонуу менен көрсөтүлгөн byte массивинде көрсөтүлгөн маанини издейт.
  • Чалуу жасалганга чейин массив сорттолушу керек ( sort(byte[]) ыкмасын колдонуу менен). Ал иргелбесе, жыйынтыгы аныктал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() методу сиз издеген массивди биринчи аргумент катары, башталгыч индексти экинчи аргумент, аяктоочу индексти үчүнчү, ачкычты төртүнчү катары алат. Аяктоочу индексти массивдин узундугунда сактасаңыз, ыкма жакшы иштеши керек. Бирок, эгер сиз андан ашсаңыз, сиз арактан тышкары Массив индексин аласыз . Бул абдан жөнөкөй, туурабы? Метод, эгерде элемент табылса, анын индексин кайтарат. Бирок ал берилген элементти таппаса эмне болот?

Arrays.binarySearch() берилген элементти таппаса эмне болот?

Келгиле, Arrays.binarySearch() методу үчүн расмий documentтерди дагы бир карап көрөлү :
  • Метод издөө натыйжаларында ачкычтын индексин табат, эгерде ал массивде көрсөтүлгөн диапазондо камтылган болсо; антпесе (-(киргизүү чекити) - 1) алабыз .
  • Киргизүү чекити массивге ачкыч киргизиле турган чекит катары аныкталат: диапазондогу биринчи элементтин индекси ачкычтан чоңураак, же диапазондогу бардык элементтер төмөнкү көрсөткүчтөн кичине болсо, toIndex (аягы индекси) көрсөтүлгөн ачкыч.
  • Кайтаруу мааниси ачкыч табылганда 0дөн чоң же барабар болорун эске алыңыз.
Абдан ачык эмес, туурабы? Биринчи сапта, эгерде ал массивде табылса, метод издөөдөн ачкычтын индексин кайтарат деп айтылат. Эгерде ал табылбаса, анда чыгаруу (-(киргизүү чекити) - 1) мааниге барабар болот . Издөө баскычына жараша, киргизүү чекити ар кандай мааниге ээ болушу мүмкүн. Бизде массив [5, 6, 7, 8, 9, 10] жана 0 издөө ачкычы бар дейли , ал массивде так жок. Бул учурда издөө ачкычы массивдин бардык элементтеринен азыраак болот. Бирок издөө ачкычынан чоңураак биринчи элемент 5 болуп саналат . Ошентип, биздин учурда киргизүү чекити болот:
(-(издөө ачкычынан чоңураак биринчи элементтин индекси) - 1) = (0 - 1) = -1
Сиз муну төмөнкүдөй code үзүндүсүндө ишке ашыра аласыз:
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 болот . Сиз муну төмөнкүдөй code үзүндүсүндө ишке ашыра аласыз:
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 codeу колдонулат. Башкача айтканда, A (65) а (97) дан аз болот . Программаңыздын жыйынтыгын кайчылаш текшерүүдө муну эске алыңыз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION