JavaRush /مدونة جافا /Random-AR /استراحة القهوة رقم 156. كيفية استخدام طريقة Arrays.binary...

استراحة القهوة رقم 156. كيفية استخدام طريقة Arrays.binarySearch () في Java

نشرت في المجموعة
المصدر: FreeCodeCamp ستتعلم من خلال هذه المقالة كيفية استخدام طريقة Arrays.binarySearch() في Java. استراحة القهوة رقم 156.  كيفية استخدام طريقة Arrays.binarySearch() في Java - 1

ما هو Arrays.binarySearch () في جافا؟

تنص الوثائق الرسمية للطريقة Arrays.binarySearch() على ما يلي:
  • تبحث هذه الطريقة في صفيف البايت المحدد عن القيمة المحددة باستخدام خوارزمية بحث ثنائية.
  • يجب فرز المصفوفة (باستخدام طريقة الترتيب (بايت[]) ) قبل إجراء الاستدعاء. إذا لم يتم فرزها، لن يتم تحديد النتائج.
  • إذا كانت المصفوفة تحتوي على عناصر متعددة بالقيمة المحددة، فليس هناك ما يضمن العثور على العنصر الذي سيتم العثور عليه.
بعبارات بسيطة، يمكن للأسلوب 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 للحرف المقابل. أي أن (65) سيكون أقل من (97) . ضع ذلك في الاعتبار عند التحقق من مخرجات برنامجك.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION