المسارات
/
Java
Java
/
التمارين
/
التقطها كلها!
التقطها كلها!

التقطها كلها!

تمرين تعلّمي

مقدمة

المجموعات

المجموعة Set هي تجمّع غير مرتب من العناصر، وبخلاف List، نضمن أنها لا تحتوي على أي قيم مكررة.

معامل النوع العام لواجهة Set يحدد نوع العناصر الموجودة في المجموعة:

Set<Integer> ints = Set.of(1, 2, 3);
Set<String> strings = Set.of("alpha", "beta", "gamma");
Set<Object> mixed = Set.of(1, false, "foo");

لاحظ أن الطريقة Set.of() تُنشئ نسخة Set غير قابلة للتعديل. محاولة استدعاء طرق مثل add و remove على هذه النسخة ستؤدي إلى استثناء في وقت التشغيل.

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

Set<Integer> ints = new HashSet<>();

واجهة Set ترث من واجهتي Collection و Iterable، ولذلك تتشارك الكثير من الطرق مع أنواع أخرى من التجمّعات. لكن الفرق الملحوظ عن واجهة Collection هو أن طرقًا مثل add و remove تُرجع قيمة boolean (بدلًا من void) تشير إلى ما إذا كان العنصر موجودًا في المجموعة عند استدعاء تلك الطريقة:

Set<Integer> set = new HashSet<>();
set.add(1);
// => true
set.add(2);
// => true
set.add(1);
// => false
set.size();
// => 2
set.contains(1);
// => true
set.contains(3);
// => false
set.remove(3);
// => false
set.remove(2);
// => true
set.size();
// => 1

التعليمات

حنينك إلى بطاقات Blorkemon™️ لا يبدو أنه سيخبو؛ فقد بدأت تجمعها من جديد، وتجعل أصدقاءك ينضمون إليك.

في هذا التمرين، ستستخدم واجهة Set لمساعدتك على إدارة مجموعتك، لأن البطاقات المكررة لا تهم عندما يكون هدفك جمع كل البطاقات الموجودة.

1. ابدأ مجموعة

لقد وجدت للتو مخزونك القديم من بطاقات Blorkemon™️! يحتوي المخزون على مجموعة من البطاقات المكررة، لذا حان الوقت لبدء مجموعة جديدة بإزالة المكرر منها.

أنت تتوق حقًا لأن ينضم أصدقاؤك إلى جنون Blorkemon™️، وأفضل طريقة لذلك هي أن تطلق مجموعتهم بمنحهم بطاقة واحدة.

نفّذ طريقة newCollection التي تحوّل مصفوفة من البطاقات إلى Set يمثل مجموعتك الجديدة.

GottaSnatchEmAll.newCollection(List.of("Newthree", "Newthree", "Newthree"));
// => {"Newthree"}

2. وسّع المجموعة

بمجرد أن تصبح لديك مجموعة، فإنها تستقل بحياتها الخاصة ويجب أن تنمو.

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

Set<String> collection = GottaSnatchEmAll.newCollection("Newthree");
GottaSnatchEmAll.addCard("Scientuna",collection);
// => true

collection.contains("Scientuna");
// => true

3. ابدأ المقايضة

أنت تتوق حقًا لأن ينضم أصدقاؤك إلى جنون Blorkemon™️، لذا حان وقت المقايضة!

عند المقايضة مع الأصدقاء، ليست كل مقايضة تستحق أو يمكن إجراؤها أصلًا. ينبغي ألا تقايض إلا إذا كانت لديك أنت وصديقك بطاقة لا يملكها الطرف الآخر.

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

Set<String> myCollection = Set.of("Newthree");
Set<String> theirCollection = Set.of("Scientuna");
GottaSnatchEmAll.canTrade(myCollection, theirCollection);
// => true

4. حدّد البطاقات المشتركة

تجتمع أنت وأصدقاؤك المهووسون بـ Blorkemon™️ وتتساءلون أي البطاقات هي الأكثر شيوعًا.

نفّذ طريقة commonCards التي تأخذ مصفوفة من المجموعات وتُرجع مجموعة من البطاقات التي تملكها كل المجموعات.

GottaSnatchEmAll.commonCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Scientuna"}

5. كل البطاقات

هل تملك أنت وأصدقاؤك مجتمعين كل بطاقات Blorkemon™️؟

نفّذ طريقة allCards التي تأخذ مصفوفة من المجموعات وتُرجع مجموعة بكل البطاقات المختلفة في جميع المجموعات مجتمعة.

GottaSnatchEmAll.allCards(List.of(Set.of("Scientuna"), Set.of("Newthree","Scientuna")));
// => {"Newthree", "Scientuna"}
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Java Exercism

مستعد لبدء التقطها كلها!؟

سجّل في Exercism لتتعلّم وتتقن Java عبر 26 مفهومًا158 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.