البرمجة

كيفية التحقق من وجود أي عنصر من مجموعة في Scala

للتحقق مما إذا كانت مجموعة (Collection) تحتوي على أي عنصر من مجموعة أخرى في Scala، يمكنك استخدام الدوال المتاحة في المكتبة القياسية للغة. واحدة من الطرق البسيطة للقيام بذلك هي استخدام دالة exists التي تقوم بتطبيق شرط معين على كل عنصر في المجموعة وترجع true إذا وجدت عنصر يطابق الشرط.

على سبيل المثال، إذا كانت a و b هما مجموعتين، يمكنك كتابة الكود التالي:

scala
val a = Set(1, 2, 3, 4, 5) val b = Set(4, 5, 6, 7, 8) val containsAny = a.exists(b.contains)

في هذا المثال، exists تتحقق مما إذا كان هناك أي عنصر في a ينتمي إلى b باستخدام b.contains كدالة تحقق.

يمكنك أيضًا استخدام intersect للحصول على مجموعة العناصر المشتركة بين المجموعتين، ومن ثم التحقق مما إذا كانت المجموعة الناتجة غير فارغة:

scala
val containsAny = a.intersect(b).nonEmpty

بالنسبة للاستفسار عن وجود مكتبة توفر وظيفة مشابهة لـ CollectionUtils.containsAny من Apache Commons في Scala، هناك العديد من المكتبات التي توفر هذه الوظيفة مثل Cats أو Scalaz. ومع ذلك، يمكنك القيام بذلك بسهولة باستخدام الدوال المتاحة في المكتبة القياسية للغة كما تم شرحه في الأمثلة أعلاه.

المزيد من المعلومات

بالطبع! في Scala، يمكنك أيضًا استخدام دالة exists مع تحديد الشرط بشكل أوضح باستخدام الإشارة =>:

scala
val containsAny = a.exists { elementA => b.exists(elementB => elementA == elementB) }

هذا الشكل يستخدم تقنية الـ”currying” لتمرير شرط البحث إلى الدالة exists كدالة معامل واحد، مما يجعل الكود أكثر وضوحًا وقراءة.

بالإضافة إلى ذلك، يمكنك استخدام الدوال المشتقة مثل filter للعناصر المشتركة والتحقق من عدم فراغ النتيجة:

scala
val containsAny = a.filter(b.contains).nonEmpty

وفي حال كنت ترغب في تجنب استخدام الدوال العالية (higher-order functions)، يمكنك استخدام حل تقليدي يستخدم حلقات (loops) للتحقق من وجود أي عنصر من المجموعة الأولى في الثانية:

scala
var containsAny = false val iterA = a.iterator while (iterA.hasNext && !containsAny) { val elemA = iterA.next() val iterB = b.iterator while (iterB.hasNext && !containsAny) { val elemB = iterB.next() if (elemA == elemB) { containsAny = true } } }

ومن المهم أيضًا النظر في أداء الحلول المختلفة حسب حجم البيانات، حيث قد تكون الدوال العالية تعمل بشكل أفضل في بعض الحالات بينما تكون الحلقات أكثر كفاءة في حالات أخرى.

زر الذهاب إلى الأعلى