مراجعة - عداد تكرار الكلمات
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 30 من 68.
التحدي
سهلقم ببناء أداة لتحليل النصوص تقوم بحساب تردد الكلمات في مستند ما. يوضح هذا التحدي كيف تتفوق الخرائط (maps) في تجميع البيانات من خلال تتبع عدد مرات ظهور كل كلمة فريدة في نص معين.
ستتلقى مدخلين:
- سلسلة نصية تمثل النص المراد تحليله (على سبيل المثال،
"the quick brown fox jumps over the lazy dog the fox is quick") - سلسلة نصية تمثل الحد الأدنى لتردد الكلمات (على سبيل المثال،
"2")
هام: قد يحتوي النص المدخل على مسافات، لذا يجب عليك قراءة السطر بالكامل باستخدام bufio.NewReader مع ReadString('\n') أو bufio.Scanner — لا تستخدم fmt.Scanln لإدخال النص، لأنه يتوقف عن القراءة عند أول مسافة.
مهمتك هي:
- إنشاء دالة تسمى
countWordsتأخذ سلسلة نصية وتعيدmap[string]intحيث:- المفاتيح هي كلمات فردية (strings)
- القيم هي عدد تردد كل كلمة (integers)
- تحليل النص المدخل عن طريق تقسيمه إلى كلمات فردية باستخدام
strings.Fields(التي تقسم النص عند أي مسافة بيضاء) - حساب تردد كل كلمة في النص:
- تحويل جميع الكلمات إلى أحرف صغيرة (lowercase) لضمان اتساق الحساب
- لكل كلمة، قم بزيادة عدادها في الخريطة (map)
- إذا لم تكن الكلمة موجودة في الخريطة بعد، فستبدأ من 0 ويتم زيادتها إلى 1
- تصفية النتائج لإظهار الكلمات التي تظهر على الأقل بعدد مرات يساوي الحد الأدنى (threshold)
- عرض النتائج بالتنسيق التالي:
- العنوان:
"Word Frequency Analysis:" - لكل كلمة مؤهلة:
"[word]: [count]" - عرض الكلمات بترتيب أبجدي
- العنوان:
- حساب وعرض إحصائيات ملخصة:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"
على سبيل المثال، إذا كان النص المدخل "hello hello world" والحد الأدنى "2"، يجب أن يكون المخرج:
Word Frequency Analysis: hello: 2 Total unique words: 2 Words above threshold: 1 Most frequent word: hello (2 times)
استخدم حزمة bufio لقراءة أسطر الإدخال الكاملة، وحزمة strings لتقسيم النص وتحويله إلى أحرف صغيرة، وحزمة strconv لتحويل سلسلة الحد الأدنى النصية إلى عدد صحيح، وحزمة sort لفرز الكلمات أبجدياً. يوضح هذا التحدي كيف توفر الخرائط حلاً أنيقاً لعد وتجميع البيانات، حيث تجعل خاصية القيمة الصفرية (zero-value) في الخرائط منطق العد بسيطاً وفعالاً.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// قراءة سطر النص الكامل (بما في ذلك المسافات)
scanner.Scan()
text := scanner.Text()
// قراءة قيمة العتبة (threshold)
scanner.Scan()
thresholdStr := scanner.Text()
// تحويل العتبة إلى عدد صحيح
threshold, _ := strconv.Atoi(thresholdStr)
// TODO: اكتب الكود الخاص بك أدناه
// 1. قم بإنشاء دالة countWords التي ترجع map[string]int
// تلميح: استخدم strings.Fields و strings.ToLower لتقسيم الكلمات وتوحيد حالتها
// 2. استخدم الدالة لحساب ترددات الكلمات
// 3. قم بتصفية الكلمات التي تظهر على الأقل عدد 'threshold' من المرات
// 4. قم بفرز الكلمات المصفاة أبجدياً وعرضها
// 5. حساب وعرض الإحصائيات الملخصة
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}جميع دروس Logic & Flow
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)ملخص - الأشكال والسلوكيات