0Pricing
Java Academy · درس

Arrays.binarySearch

ابحثوا في المصفوفات المرتبة

Arrays.binarySearch درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

البحث في المصفوفات المرتبة

تعثر Arrays.binarySearch على عنصر في مصفوفة مرتبة خلال زمن O(log n). إذ تقسم نطاق البحث إلى نصفين مرارًا، ما يجعلها أسرع بكثير من فحص كل عنصر.

شرط الترتيب المسبق

يجب أن تكون المصفوفة مرتبة مسبقًا ترتيبًا تصاعديًا. وإذا لم تكن كذلك، تكون النتيجة غير محددة. استدعِ Arrays.sort أولًا دائمًا إذا لم تكن متأكدًا.

بحث أساسي

عند العثور على القيمة، تُرجع binarySearch الفهرس الخاص بها.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = {2, 4, 6, 8, 10};
        int index = Arrays.binarySearch(nums, 8);
        System.out.println("Found at index " + index);
    }
}

عند غياب القيمة

إذا لم تكن القيمة موجودة، تكون القيمة المُرجعة سالبة، وتساوي -(insertionPoint) - 1. ونقطة الإدراج هي الموضع الذي ستوضع فيه القيمة للحفاظ على ترتيب المصفوفة.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = {2, 4, 6, 8, 10};
        int result = Arrays.binarySearch(nums, 5);
        System.out.println("Raw result: " + result);
    }
}

استخراج نقطة الإدراج

لتحويل النتيجة السالبة إلى فهرس الإدراج، احسب -(result) - 1. ويخبرك ذلك بالموضع الذي تُدرج فيه القيمة المفقودة.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = {2, 4, 6, 8, 10};
        int result = Arrays.binarySearch(nums, 5);
        if (result < 0) {
            int insertionPoint = -(result) - 1;
            System.out.println("Would insert at index " + insertionPoint);
        }
    }
}

البحث في مصفوفات الكائنات

تعمل binarySearch أيضًا مع مصفوفات الكائنات باستخدام الترتيب الطبيعي. ويجب أن تكون المصفوفة مرتبة بالطريقة نفسها التي تُجري بها عملية البحث المقارنة.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] names = {"Alice", "Bob", "Charlie", "Dave"};
        int index = Arrays.binarySearch(names, "Charlie");
        System.out.println("Charlie at index " + index);
    }
}

البحث باستخدام Comparator

إذا كانت المصفوفة قد فُرزت باستخدام Comparator مخصص، فيجب تمرير Comparator نفسه إلى binarySearch، وإلا فلن تكون النتائج ذات معنى.

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        String[] names = {"Dave", "Charlie", "Bob", "Alice"};
        Comparator<String> desc = Comparator.reverseOrder();
        Arrays.sort(names, desc);
        int index = Arrays.binarySearch(names, "Charlie", desc);
        System.out.println("Index: " + index);
    }
}

البحث في نطاق

يمكنك حصر البحث في جزء من المصفوفة باستخدام binarySearch(array, fromIndex, toIndex, key). وتتبع حدود النطاق قاعدة الشمول والاستبعاد نفسها المتبعة في الفرز.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = {2, 4, 6, 8, 10, 12};
        int index = Arrays.binarySearch(nums, 1, 5, 8);
        System.out.println("Index: " + index);
    }
}

القيم المكررة غير محددة

إذا احتوت المصفوفة على قيم مكررة، فلا يوجد ضمان بشأن الفهرس المطابق الذي سيُرجع. ومن الأفضل استخدام البحث الثنائي مع المصفوفات التي تحتوي على مفاتيح فريدة.

لماذا لا نستخدم حلقة فحسب؟

يستغرق الفحص الخطي O(n) ويعمل مع البيانات غير المرتبة. أما البحث الثنائي فيستغرق O(log n)، لكنه يتطلب بيانات مرتبة. وعند إجراء عمليات بحث متكررة في مجموعات بيانات كبيرة، فإن فرز البيانات مرة واحدة ثم إجراء البحث الثنائي مرات عديدة يحقق مكسبًا كبيرًا.

جمع الخطوات معًا

افرز المصفوفة، ثم ابحث فيها، وفسّر النتيجة بأمان.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] ids = {40, 10, 30, 20};
        Arrays.sort(ids);
        int r = Arrays.binarySearch(ids, 30);
        if (r >= 0) {
            System.out.println("Found 30 at index " + r);
        } else {
            System.out.println("Not found; insert at " + (-(r) - 1));
        }
    }
}

تحقق سريع

اختبر فهمك لـ binarySearch.

مراجعة

لقد تعلمت البحث السريع باستخدام Arrays.binarySearch.

  • يجب فرز المصفوفة أولًا.
  • تشير النتيجة غير السالبة إلى الفهرس الذي عُثر عليه.
  • تشفّر النتيجة السالبة نقطة الإدراج باستخدام -(result) - 1.
  • استخدم Comparator نفسه للفرز والبحث.

الأسئلة الشائعة

هل درس «Arrays.binarySearch» مجاني؟

نعم — نص درس «Arrays.binarySearch» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «Arrays.binarySearch»؟

ابحثوا في المصفوفات المرتبة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «Arrays.binarySearch»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Arrays.sort والفرز
  2. Arrays.binarySearch
  3. Arrays.fill وcopyOf
  4. الدالتان Arrays.equals وtoString
← العودة إلى Java Academy