JavaRush /وبلاگ جاوا /Random-FA /کافه استراحت شماره 156. نحوه استفاده از متد Arrays.binary...

کافه استراحت شماره 156. نحوه استفاده از متد Arrays.binarySearch() در جاوا

در گروه منتشر شد
منبع: FreeCodeCamp با این مقاله، نحوه استفاده از متد Arrays.binarySearch() در جاوا را خواهید آموخت. کافه استراحت شماره 156.  نحوه استفاده از متد Arrays.binarySearch() در جاوا - 1

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() آرایه ای را که می خواهید جستجو کنید به عنوان آرگومان اول، شاخص شروع به عنوان آرگومان دوم، شاخص پایانی به عنوان آرگومان سوم، و کلید را به عنوان آرگومان چهارم در نظر می گیرد. تا زمانی که شاخص پایانی را در طول آرایه نگه دارید، روش باید به خوبی کار کند. اما اگر از آن تجاوز کنید، یک آرایه شاخص استثنایی خارج از محدوده دریافت خواهید کرد . خیلی ساده است، درست است؟ متد در صورت یافتن ایندکس عنصر را برمی گرداند. اما اگر عنصر داده شده را پیدا نکند چه اتفاقی می افتد؟

وقتی Arrays.binarySearch() یک عنصر معین را پیدا نمی کند چه اتفاقی می افتد؟

بیایید نگاهی دیگر به مستندات رسمی متد Arrays.binarySearch() بیندازیم :
  • این روش اگر در آرایه در محدوده مشخص شده باشد، شاخص یک کلید را در نتایج جستجو پیدا می کند. در غیر این صورت (-(نقطه درج) - 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