المسح والنسخ
جزء من قسم Logic & Flow في رحلة Java على Coddy — الدرس 27 من 59.
تقوم الطريقة clear() بإزالة جميع العناصر من HashSet، مما يجعله فارغاً.
تُرجع الدالة clone() نسخة ضحلة (shallow copy) من الـ HashSet. (لا يتم استنساخ العناصر نفسها.)
على سبيل المثال، قم أولاً بإنشاء HashSet:
HashSet<String> set = new HashSet<>();
set.add("Coddy");لاستنساخ المجموعة:
HashSet<String> clonedSet = (HashSet<String>) set.clone();
System.out.println(clonedSet);
// المخرجات: [Coddy]لمسح المجموعة:
set.clear();
System.out.println(set.isEmpty());
// المخرجات: trueلماذا نحتاج إلى التحويل (casting) مع clone()؟
لقد تعلمت بالفعل عن التحويل (casting) مع الأنواع الأولية (مثل int x = (int) 3.14). ينطبق المفهوم نفسه على الكائنات، ولكن لسبب مختلف.
تُرجع الطريقة clone() نوع Object عاماً، وليس HashSet<String> محدداً. هذا لأن clone() مُعرفة في فئة Object ولا تعرف النوع الذي تقوم باستنساخه.
// ما ترجعه ()clone:
Object cloneResult = set.clone(); // ترجع Object، وليس HashSet<String>
// ما نحتاجه:
HashSet<String> clonedSet = (HashSet<String>) set.clone(); // تحويل النوع من Object إلى HashSet<String>عملية التحويل (cast) تخبر Java: "أنا أعلم أن هذا الـ Object هو في الواقع HashSet<String>، لذا تعامل معه على هذا الأساس."
بدون عملية التحويل (cast)، ستواجه خطأ في التجميع (compilation error) لأن Java لن تقوم بتحويل Object تلقائيًا إلى HashSet<String>.
التحدي
سهلقم بإنشاء طريقة (method) تسمى <strong>processSet</strong> تأخذ HashSet من السلاسل النصية (Strings) كمدخل. يجب أن تقوم الطريقة بما يلي:
- استنساخ (Clone) المجموعة.
- مسح (Clear) المجموعة الأصلية.
- طباعة المجموعة المستنسخة وحجمها بالتنسيق التالي:
Cloned Set: [elements]Cloned Set Size: X - طباعة المجموعة الأصلية (بعد المسح) وحجمها بالتنسيق التالي:
Original Set after clear: [elements]Original Set Size: Y
ورقة مرجعية
تزيل الطريقة clear() جميع العناصر من الـ HashSet:
set.clear();تعيد الطريقة clone() نسخة ضحلة (shallow copy) من الـ HashSet:
HashSet<String> clonedSet = (HashSet<String>) set.clone();لماذا نحتاج إلى التحويل (casting): تعيد الطريقة clone() نوع Object عام، لذا يجب عليك تحويله إلى HashSet<String> لاستخدامه كنوع محدد.
مثال على الاستخدام:
HashSet<String> set = new HashSet<>();
set.add("Coddy");
// استنساخ المجموعة (تحويل Object ← HashSet<String>)
HashSet<String> clonedSet = (HashSet<String>) set.clone();
// مسح المجموعة الأصلية
set.clear();
System.out.println(set.isEmpty()); // المخرجات: true
System.out.println(clonedSet); // المخرجات: [Coddy] (النسخة لا تتأثر)جرّب بنفسك
import java.util.HashSet;
import java.util.Scanner;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
@SuppressWarnings("unchecked")
public class Main {
public static void processSet(HashSet<String> set) {
// اكتب كودك هنا
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String setString = scanner.nextLine();
Type setType = new TypeToken<HashSet<String>>(){}.getType();
HashSet<String> set = new Gson().fromJson(setString, setType);
processSet(set);
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفات ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادمراجعة - المصفوفات ثنائية الأبعادجمع وطرح المصفوفاتالمصفوفات المتعرجة (Jagged Arrays)المصفوفات ثلاثية الأبعاد وما بعدهاأنماط المصفوفات ثنائية الأبعاد الشائعةمراجعة - كل شيء عن المصفوفات4HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمالمسح والنسخملخص - HashSet2HashMap الجزء الأول
ما هو الـ HashMap؟تعريف الـ HashMapالوصول إلى القيمالتحقق من وجود المفتاحتعديل القواميسملخص - HashMap3HashMap الجزء الثاني
دوال HashMapالتكرار باستخدام keySet()التكرار باستخدام entrySet()HashMap متداخلمراجعة - إدارة المستودعمراجعة - عمليات HashMap6التحكم المتقدم في تدفق البرنامج
العبارات المعنونةتعبير Switchمطابقة الأنماطجمل الحمايةمراجعة - تدفق التحكم