مراجعة - عداد تكرار الكلمات
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 30 من 68.
التحدي
سهلأنشئ أداة لتحليل النصوص تحسب تكرارات الكلمات في مستند. يوضح هذا التحدي كيف تتفوق الخرائط في تجميع البيانات من خلال تتبّع عدد مرات ظهور كل كلمة فريدة في جزء من النص.
ستتلقى مُدخلين:
- سلسلة نصية تمثل النص المراد تحليله (مثلًا،
"the quick brown fox jumps over the lazy dog the fox is quick") - سلسلة نصية تمثل الحد الأدنى لعتبة التكرار (مثلًا،
"2")
مهم: قد يحتوي النص المُدخل على مسافات، لذلك يجب قراءة السطر الكامل باستخدام bufio.NewReader مع ReadString('\n') أو باستخدام bufio.Scanner: لا تستخدم fmt.Scanln لإدخال النص، لأنه يتوقف عن القراءة عند أول مسافة.
مهمتك هي:
- إنشاء function باسم
countWordsتأخذ سلسلة نصية وتُرجعmap[string]intحيث:- المفاتيح هي الكلمات الفردية (سلاسل نصية)
- القيم هي عدد تكرارات كل كلمة (أعداد صحيحة)
- تحليل النص المُدخل بتقسيمه إلى كلمات فردية باستخدام
strings.Fields(التي تقسّم النص عند أي مسافة بيضاء) - حساب تكرار كل كلمة في النص:
- تحويل جميع الكلمات إلى أحرف صغيرة لضمان اتساق العد
- لكل كلمة، زيادة عددها في الخريطة
- إذا لم تكن الكلمة موجودة في الخريطة بعد، فستبدأ بالقيمة 0 وتزداد إلى 1
- تصفية results لإظهار الكلمات التي تظهر عددًا من المرات لا يقل عن قيمة threshold
- عرض النتائج بالتنسيق التالي:
- العنوان:
"Word Frequency Analysis:" - لكل كلمة مؤهلة:
"[word]: [count]" - عرض الكلمات بترتيب alphabetical
- العنوان:
- حساب وعرض إحصاءات ملخّصة:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"- عندما تشترك عدة كلمات في أعلى count، أبلغ عن الكلمة التي تأتي أولًا alphabetical. وعند ظهور كل كلمة مرة واحدة، تكون ببساطة الكلمة الأولى في القائمة المرتبة.
على سبيل المثال، إذا كان النص المُدخل "hello hello world" وكانت threshold هي "2"، فيجب أن يكون الناتج:
Word Frequency Analysis: hello: 2 Total unique words: 2 Words above threshold: 1 Most frequent word: hello (2 times)
استخدم الحزمة bufio لقراءة أسطر الإدخال الكاملة، والحزمة strings لتقسيم النص وتحويله إلى أحرف صغيرة، والحزمة strconv لتحويل سلسلة threshold إلى عدد صحيح، والحزمة sort لترتيب الكلمات alphabetically. يوضح هذا التحدي كيف توفر الخرائط حلًا أنيقًا لعدّ البيانات وتجميعها، إذ يجعل سلوك القيمة الصفرية للخرائط منطق العد بسيطًا وفعّالًا.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// اقرأ سطر النص الكامل (بما في ذلك المسافات)
scanner.Scan()
text := scanner.Text()
// اقرأ قيمة العتبة
scanner.Scan()
thresholdStr := scanner.Text()
// حوّل العتبة إلى عدد صحيح
threshold, _ := strconv.Atoi(thresholdStr)
// TODO: اكتب شفرتك أدناه
// 1. أنشئ الدالة countWords التي تُرجع map[string]int
// تلميح: استخدم strings.Fields و strings.ToLower لتقسيم الكلمات وتطبيعها
// 2. Use the function to count word frequencies
// 3. صفِّ الكلمات التي تظهر على الأقل 'threshold' مرات
// 4. رتّب الكلمات المُصفّاة أبجديًا واعرضها
// 5. احسب واعرض الإحصائيات الملخصة
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}جميع دروس المنطق وتدفق التنفيذ
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت