HashSet في Java
أنشئ HashSet<String> باسم tags، استدعِ tags.add("oak"); ثم tags.add("pine"); ثم tags.add("oak"); مجددًا، واطبع tags.size(). ترجم Bin.java ونفّذ java Bin. يجب أن تظهر الشاشة سطرًا واحدًا: 2. الـ oak الثاني لم يصنع قيمة ثالثة. القيم الفريدة في مجموعة واحدة هي ما تعلّمه هذه الصفحة.
قيم فريدة، لا أزواج مفتاح-وقيمة
في صفحة HashMap خزّنت مفتاحًا يشير إلى قيمة بـ put وget. يخزّن HashSet القيم وحدها. تظهر كل قيمة مرة واحدة على الأكثر. إذا نفّذت add لنفس الكلمة مرتين، تبقى المجموعة تحتفظ بها مرة واحدة. لا سلسلة مفتاح منفصلة على مسار تدريس هذه الصفحة.
افتح Bin.java. أبقِ اسم الفئة العامة Bin ليطابق اسم الملف. احذف بقايا أسطر HashMap وscores.put وscores.get وأي عرض Desk. تلك تخص صفحة الخريطة. احذف أيضًا أي ArrayList أو Rack أو Scanner أو nextLine متبقٍ. يجب ألا ينتظر البرنامج الكتابة.
قرب الأعلى، فوق public class Bin، اكتب:
import java.util.HashSet;
هذا الاستيراد يجعل نوع HashSet متاحًا بالاسم القصير. بدونه لا يرى javac الاسم القصير HashSet في هذه الصفحة. اكتب java.util وHashSet بدقة. لا تجعل import java.util.*; شرطًا هنا — استيراد واحد دقيق يكفي.
داخل main أنشئ المجموعة:
HashSet<String> tags = new HashSet<String>();
الأقواس الزاوية تحمل String لأن هذا الدرس يخزّن كلمات. الاسم tags هو ما تبقيه. استدعاء new HashSet<String>() يبني مجموعة فارغة. في هذه اللحظة تحمل صفر قيم.
أضف oak و pine ثم oak مجددًا — ثم size
استدعِ tags.add("oak"); في سطر وحده. ثم استدعِ tags.add("pine");. ثم استدعِ tags.add("oak"); مرة ثالثة بنفس الكلمة. الاستدعاء الثالث لا يكبّر المجموعة. ثم اكتب:
System.out.println(tags.size());
اطبع الحجم لا المجموعة كاملة للملف الأول المحفوظ. الرقم 2 يثبت أن التكرار تُجاهل. احفظ قبل الترجمة.
import java.util.HashSet;
public class Bin {
public static void main(String[] args) {
HashSet<String> tags = new HashSet<String>();
tags.add("oak");
tags.add("pine");
tags.add("oak");
System.out.println(tags.size());
}
}
من المجلد الذي يحوي Bin.java نفّذ javac Bin.java. عندما تتطابق الأقواس والدعامات والأقواس الزاوية والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Bin — لا java Bin.java ولا java HashSet. احذف نهاية .java من أمر التشغيل.
يجب أن يطبع البرنامج سطرًا ويتوقف: 2. لا يطلب منك الكتابة. إذا انتظرت الطرفية إدخال لوحة المفاتيح، فما زال استدعاء nextLine من تمرين أقدم في أحد الملفات. احذف ذلك الاستدعاء وأبقِ الإنشاء وثلاثة أسطر add وSystem.out.println(tags.size());.
امشِ التشغيل مرة. تبدأ Java من Bin.main. الاستيراد قد سمّى أي HashSet تقصد. سطر new يبني مجموعة فارغة. أول add يخزّن oak. الثاني يخزّن pine. الثالث add("oak") يجد oak موجودًا ولا يرفع العدّ. طباعة size() تكتب 2. تظهر الشاشة 2. لا يجب أن يطبع شيء آخر. إذا رأيت 3 فأنت لا تشغّل ملف HashSet هذا، أو أضفت كلمة ثالثة مختلفة مثل elm. إذا رأيت leaf فما زال عرض HashMap من Desk يعمل — انتقل إلى java Bin. إذا رأيت [oak, pine] فقد طبعت المجموعة كاملة بدل size()؛ أبقِ طباعة الحجم لملف التدريس الأول.
إذا قال javac إنه لا يجد HashSet، فسطر الاستيراد ناقص أو مكتوب خطأ أو موضوع بعد public class Bin. انقل import java.util.HashSet; فوق سطر الفئة. إذا كتبت tags.add(oak); بلا علامات اقتباس، يعامل javac كلمة oak كاسم مفقود. أبقِ الاقتباس. لا تستدعِ put على HashSet في هذه الصفحة — ذلك الاسم يخص HashMap.
اسأل بـ contains
ملف Bin ثانٍ يتحقق مما إذا كان oak في المجموعة بعد نفس أول إضافةين.
import java.util.HashSet;
public class Bin {
public static void main(String[] args) {
HashSet<String> tags = new HashSet<String>();
tags.add("oak");
tags.add("pine");
System.out.println(tags.contains("oak"));
}
}
ترجم ونفّذ ذلك الملف الثاني بنفس الطريقة. تظهر الشاشة true. استدعاء contains("oak") يسأل هل تلك القيمة موجودة في المجموعة. يعيد boolean. إذا سألت contains("elm") بعد إضافة oak و pine فقط، تظهر الشاشة false — ذلك صحيح، لكن الملف الثاني المحفوظ يستخدم "oak" فتكون الشاشة true.
لا تجعل حلقة على المجموعة شرطًا في هذه الصفحة. صفحة لاحقة — iterating — تمشي على المجموعات. ابقَ هنا مع add وsize وcontains.
جنبًا إلى جنب مع HashMap
جدول قصير يبقي الفرق واضحًا.
📊 HashSet vs HashMap
| Piece | On this page |
|---|---|
| store | tags.add("oak"); — value only |
| duplicate | second add("oak") does not grow size |
| read check | tags.contains("oak") → true |
| HashMap leftover | put / get — not this page’s path |
الجدول تذكير فقط. القطع التي تبقيها هي استيراد HashSet وخط الإنشاء ونداءات add وsize() وcontains. |
مقارنة مع HashMap ومع ArrayList
في صفحة HashMap استخدم put وget مفتاحًا. في هذه الصفحة يستخدم add وcontains القيمة نفسها. ملف Desk متبقٍ يطبع leaf درس مختلف. لهذه الصفحة أبقِ HashSet<String> tags وعرض الحجم الذي يطبع 2.
يمكن لـ ArrayList أن يحمل نفس الكلمة مرتين. لن يكبر HashSet لإضافة ثانية مطابقة لتلك الكلمة. تلك الفرادة هي نقطة هذا الدرس. لا تخلط tags.get(0) في عروض Bin — المجموعات لا تستخدم أرقام خانات القائمة في هذه الصفحة.
عندما تبقى ملفات Desk.java أو Rack.java القديمة قريبة، اتركها أو احذفها فقط إن أربكت أي فئة تشغّل. نفّذ java Bin بعد ترجمة ملف HashSet لهذا الدرس.
ما يبقى لـ iterating
تفتح هذه الصفحة مجموعة قيم فريدة. الصفحة التالية تمشي على المجموعات بحلقة. ابقَ هنا مع add وsize وcontains. لا تجعل for-each على المجموعة شرطًا في هذه الصفحة؛ هدف الدرس هو الفرادة وشاشة 2 من size().
قبل iterating
يمكنك استيراد java.util.HashSet، وإنشاء HashSet<String> tags، وإضافة oak و pine و oak مجددًا، ثم طباعة tags.size() لترى 2. ملف ثانٍ يمكنه طباعة tags.contains("oak") ليرى true. ترجم Bin.java ونفّذ java Bin لكل عرض محفوظ. أبقت المجموعة القيم الفريدة. الصفحة التالية هي iterating، حيث تمشي قيم المجموعة واحدة تلو الأخرى.
أبقِ الاستيراد فوق الفئة. أبقِ add("oak") المكرر في عرض الحجم ليبقى العدّ 2. أبقِ contains لفحص الـ boolean. هذه العادات نقطة تفتيش هذه الصفحة قبل الانتقال. عندما يظهر size() الرقم 2 بعد ثلاث إضافات مع oak مكرر، أنجز HashSet عمله لهذا الدرس وأنت جاهز للموضوع التالي.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى