كيفية التحقق مما إذا كانت المصفوفة تحتوي على قيمة في Java: 5 أخطاء قاتلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية التحقق مما إذا كانت المصفوفة تحتوي على قيمة في Java؟ نحلل أهم الأخطاء (ونتعلّم منها)



تخيل الموقف: أنت تكتب كوداً بلغة Java، لديك مصفوفة من السلاسل النصية (أو الأرقام)، وتحتاج إلى معرفة - هل هناك قيمة محددة فيها؟ قد يبدو الأمر بسيطاً، أليس كذلك؟ لكن هذا السؤال بالتحديد (How do I determine whether an array contains a particular value in Java?) حصل على أكثر من نصف مليون مشاهدة على Stack Overflow. آلاف المطورين (من المبتدئين إلى الخبراء) يتعثرون في نفس الأخطاء.



في هذه المقالة، لن نقدم إجابة جاهزة فقط. بل سنستعرض أكثر 5 أخطاء شيوعاً التي تحول مهمة بسيطة إلى صداع. ستتعرف على لماذا قد لا يعمل Arrays.asList().contains()، وكيف تجعل Stream يتعامل مع الأنواع البدائية، ومتى يصبح البحث الثنائي فخاً. هيا بنا!



الخطأ رقم 1: استخدام equals() مع المصفوفات (الكارثة الكبرى للمبتدئين)



أكثر فشل شائع - محاولة استدعاء equals() أو contains() مباشرة على المصفوفة.



// ❌ خطأ قاتلString[] fruits = {"apple", "banana", "orange"};System.out.println(fruits.equals("apple")); // falseSystem.out.println(fruits.contains("apple")); // خطأ في الترجمة!


لماذا لا يعمل هذا؟ المصفوفة في Java هي كائن، لكن ليس لديها طريقة contains(). وطريقة equals() تقارن المراجع (عناوين الذاكرة)، وليس المحتوى. مصفوفتك fruits هي كائن في الكومة، والسلاسل النصية "apple" هي كائن آخر. لن يكونا متساويين أبداً.



الطريقة الصحيحة: استخدام حلقة أو أدوات من java.util.Arrays.



// ✅ صحيح: البحث اليدويString[] fruits = {"apple", "banana", "orange"};String target = "apple";boolean found = false;for (String fruit : fruits) {    if (target.equals(fruit)) {        found = true;        break;    }}System.out.println(found); // true


الخطأ رقم 2: Arrays.asList().contains() للمصفوفات البدائية



حل عبقري في خبثه. تقرأ Stack Overflow، ترى النصيحة Arrays.asList(yourArray).contains(value) وتطبقها بسعادة على مصفوفة int[]. وتحصل على false.



// ❌ لا يعمل مع الأنواع البدائيةint[] numbers = {1, 2, 3, 4, 5};List<Integer> list = Arrays.asList(numbers); // انتبه!System.out.println(list.contains(3)); // false 


لماذا؟ Arrays.asList() للمصفوفة البدائية int[] ينشئ List<int[]> (قائمة من عنصر واحد - المصفوفة)، وليس List<Integer>. أنت تتحقق مما إذا كانت القائمة تحتوي على المصفوفة numbers والرقم 3. بالطبع لا. القائمة تحتوي على عنصر واحد - المصفوفة نفسها {1,2,3,4,5}.



الطريقة الصحيحة: للأنواع البدائية، استخدم حلقة، أو IntStream، أو حوّل إلى قائمة من الكائنات.



// ✅ صحيح: عبر IntStream (Java 8+)int[] numbers = {1, 2, 3, 4, 5};boolean found = IntStream.of(numbers).anyMatch(n -> n == 3);System.out.println(found); // true

// ✅ أو عبر حلقةboolean found2 = false;for (int num : numbers) { if (num == 3) { found2 = true; break; }}


الخطأ رقم 3: الاستخدام الساذج لـ binarySearch() بدون ترتيب



Arrays.binarySearch() أداة قوية، لكنها تعمل فقط على المصفوفات المرتبة. إذا أعطيتها مصفوفة غير مرتبة، ستكون النتيجة غير متوقعة (غالباً رقم سالب، حتى لو كان العنصر موجوداً).



// ❌ بحث ثنائي على مصفوفة غير مرتبةString[] unsorted = {"banana", "apple", "orange"};int index = Arrays.binarySearch(unsorted, "apple");System.out.println(index); // قد يكون                

المدونات

توصيات الكتب