الدرس 10 من 10
القوائم والقواميس
- 16 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
العدّ والتجميع بـ ArrayList وHashMap
الشرح
طول المصفوفة ثابت، أما ArrayList فقائمة تكبر وتصغر، تنشئها بـ List<String> loot = new ArrayList<>(); ثم تستعمل loot.add("sword") للإضافة، وloot.get(0) للقراءة، وloot.size() لمعرفة العدد، وloot.contains("bow") لتعرف هل العنصر موجود. وما تكتبه بين < > هو نوع العناصر، ولا يُقبل فيه إلا اسم صنف، فتكتب Integer بدل int، وJava تحوّل بينهما من تلقاء نفسها.
أما HashMap فقاموس (Map) يربط كل مفتاح بقيمة، مثل Map<String, Integer> counts = new HashMap<>();، فتضع put(k, v) القيمة أو تستبدلها، وتُرجع get(k) القيمة أو null إذا لم يكن المفتاح موجودًا، وتُرجع getOrDefault(k, 0) صفرًا بدل null، وعليها يقوم العدّ هكذا: counts.put(w, counts.getOrDefault(w, 0) + 1). وللتجميع تستعمل computeIfAbsent(key, k -> new ArrayList<>()) التي تُرجع قائمة المفتاح، وتُنشئها في أول مرّة.
وتمرّ على أزواج المفتاح والقيمة بـ for (Map.Entry<String, Integer> e : counts.entrySet())، وتأخذ من كل زوج e.getKey() وe.getValue(). وانتبه إلى أن HashMap لا تضمن أي ترتيب، فلا تحفظ ترتيب الإدخال ولا الترتيب الأبجدي، فإذا أردت المفاتيح مرتّبة فانسخها في new TreeMap<>(counts).
المطلوب
اكتب countWords(text) لتُرجع كم مرّة وردت كل كلمة، بعد تحويلها إلى حروف صغيرة ومهما كثرت المسافات، وتُرجع قاموسًا فارغًا إذا كان النصّ فارغًا، وbyLength(words) لتجمع الكلمات في قوائم بحسب طولها، بالترتيب الذي وردت به. ثم اكتب mostCommon(counts) لتُرجع الكلمة الأكثر تكرارًا، أو "" إذا كان القاموس فارغًا، وأخيرًا اطبع من main كل كلمة في counts مع عددها في سطر بالشكل gg: 3، مرتّبة أبجديًّا.
الفحوص
5 فحوص- الدالة countWords تعدّ كل كلمة
- الدالة countWords تحوّل الحروف إلى صغيرة وتتجاهل المسافات الزائدة
- الدالة byLength تجمع الكلمات بطولها وبترتيب ورودها
- الدالة mostCommon تُرجع الأكثر تكرارًا، و"" للقاموس الفارغ
- طُبعت الكلمات وأعدادها بترتيب أبجدي