ما هو محدد في جافا
دعونا نتذكر بإيجاز أن واجهة Set تحدد مجموعة (مجموعة). يعمل على توسيع المجموعة وتحديد سلوك المجموعات التي لا تسمح بالعناصر المكررة. وبالتالي، فإن الأسلوب add() يُرجع خطأ إذا جرت محاولة لإضافة عنصر مكرر إلى المجموعة. لا تحدد الواجهة أي طرق إضافية خاصة بها. تهتم واجهة Set بتفرد الكائنات المخزنة، ويتم تحديد التفرد من خلال تنفيذ طريقة يساوي () . لذلك، إذا تمت إضافة كائنات الفئة التي تم إنشاؤها إلى المجموعة ، فمن المستحسن تجاوز طريقة يساوي () .فئة LinkedHashSet
قبل الحديث عن فئة LinkedHashSet ، علينا أن نذكر قريبتها، فئة HashSet . تقوم HashSet بتنفيذ واجهة Set . يقوم بإنشاء مجموعة تخزن العناصر في جدول التجزئة. يتم تخزين عناصر جدول التجزئة كأزواج قيمة المفتاح. يحدد المفتاح الخلية (أو المقطع) لتخزين القيمة. يتم استخدام محتوى المفتاح لتحديد قيمة فريدة تسمى رمز التجزئة. يمكننا أن نفكر في رمز التجزئة كمعرف للكائن، على الرغم من أنه لا يجب أن يكون فريدًا. يعمل رمز التجزئة هذا أيضًا بمثابة فهرس يتم تخزين البيانات المرتبطة بالمفتاح فيه. تقوم فئة LinkedHashSet Java بتوسيع HashSet دون إضافة أي طرق جديدة. يسمح لك LinkedHashSet بالتحقق بسرعة من وجود إدخال، تمامًا مثل HashSet ، ولكنه يحتوي على قائمة مرتبة بالداخل. وهذا يعني أنه يخزن ترتيب الإدراج للعناصر. بمعنى آخر، يحتفظ LinkedHashSet بقائمة مرتبطة بعناصر المجموعة بالترتيب الذي تم إدراجها به. وهذا يسمح بالتكرار المرتب للإدراج في مجموعة. ولكن هذا يتسبب في قيام فئة LinkedHashSet بإجراء عمليات أطول من فئة HashSet .الميزات الهامة لLinkedHashSet
-
يمكننا تخزين العناصر الفريدة فقط في LinkedHashSet
-
يتيح لنا LinketHashSet استخراج العناصر بنفس الترتيب الذي ندرجه
-
LinkedHashSet غير متزامن
-
يسمح LinkedHashSet بتخزين العناصر الفارغة
-
يستخدم LinkedHashSet تقنية التجزئة لتخزين العناصر في فهرس محدد بناءً على رمز التجزئة
طرق LinkedHashSet
بالإضافة إلى الطرق الموروثة من الفئات الأصلية، تحدد HashSet الطرق التالية:-
تضيف الإضافة المنطقية (Object o) العنصر المحدد إلى هذه المجموعة إذا لم يكن موجودًا بالفعل.
-
يزيل void Clear() كافة العناصر من هذه المجموعة.
-
يقوم Object clone() بإرجاع نسخة سطحية من مثيل LinkedHashSet هذا : لا يتم استنساخ العناصر نفسها.
-
تحتوي القيمة المنطقية على (Object o) على إرجاع صحيح إذا كانت هذه المجموعة تحتوي على العنصر المحدد.
-
boolean isEmpty() يُرجع صحيحًا إذا كانت هذه المجموعة لا تحتوي على عناصر.
-
يقوم Iterator iterator() بإرجاع مكرر على عناصر هذه المجموعة.
-
إزالة منطقية (Object o) تزيل العنصر المحدد من هذه المجموعة، إذا كان موجودًا.
-
int size() يُرجع عدد العناصر في هذه المجموعة (عدد عناصرها).
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetEx1 {
public static void main(String[] args) {
//LinkedHashSet() Init
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet
set.add("Re"); //first added element
set.add("Do");
set.add("Fa");
set.add("Sol");
set.add("La");
set.add("Ti");
set.add("Mi");//last added element
System.out.println(set);
}
}
الإخراج هو:
مثال 2. إضافة نسخة مكررة إلى LinkedHashSet
دعونا نضع عناصر LinkedHashSet 7 الخاصة بنا مع أسماء المقطوعات الموسيقية مرة أخرى ونضع عنصرًا جديدًا يشبه أحد العناصر الموضوعة من قبل.
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetEx2 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("Re");
set.add("Do");
set.add("Fa");
set.add("Sol");
set.add("La");
set.add("Ti");
set.add("Mi");
set.add("Sol");
System.out.println(set);
}
}
مخرجات البرنامج هنا :
مثال 3. إزالة العناصر من LinkedHashSet
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSet3 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("Re");
set.add("Do");
set.add("Fa");
set.add("Sol");
set.add("La");
set.add("Ti");
set.add("Mi");
System.out.println(set);
set.remove("Fa");// removing an element from our set
set.remove("Score");//trying to remove element that isn't in set
System.out.println(set.remove("Score"));
System.out.println("Print our set without elements removed: ");
System.out.println(set);
set.clear();
System.out.println("Print out our set after clear command: ");
System.out.println(set);
}
}
مخرجات البرنامج هنا :
LinkedHashSet مقابل HashSet
وهاتان الفئتان قريبتان من بعضهما البعض. ولكن داخل HashSet يستخدم HashMap لتخزين الكائنات بينما يستخدم LinkedHashSet LinkedHashMap . إذا لم تكن بحاجة إلى الحفاظ على ترتيب الإدراج ولكنك بحاجة إلى تخزين كائنات فريدة، فمن الأفضل استخدام HashSet . إذا كنت بحاجة إلى الحفاظ على ترتيب إدراج العناصر، فإن LinkedHashSet هو اختيارك. أداء LinkedHashSet أبطأ قليلاً من أداء HashSet لأن LinkedHashSet يستخدم LinkedList الداخلي للحفاظ على ترتيب إدراج العناصر. دعونا نحصل على مثال:
import java.util.*;
public class LinkedHashSetExample1 {
public static void main(String[] args) {
// while regular hash set orders its elements according to its hashcode stamps
Set<Integer> regularHashSet = new HashSet<>();
regularHashSet.add(7);
regularHashSet.add(3);
regularHashSet.add(5);
regularHashSet.add(65536);
regularHashSet.add(9);
// few duplicates
regularHashSet.add(5);
regularHashSet.add(7);
// next will print:
// > regularHashSet = [65536, 3, 5, 7, 9]
System.out.println("regularHashSet = " + regularHashSet);
// linked hash set keeps order of adding unchanged
Set<Integer> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(7);
linkedHashSet.add(3);
linkedHashSet.add(5);
linkedHashSet.add(65536);
linkedHashSet.add(9);
// few duplicates
linkedHashSet.add(5);
linkedHashSet.add(7);
// next will print:
// > linkedHashSet = [7, 3, 5, 65536, 9]
System.out.println("linkedHashSet = " + linkedHashSet);
}
}
مخرجات البرنامج هي :
استخدام Java LinkedHashSet في تطبيقات العالم الحقيقي
نظرًا لأن LinkedHashSet يسمح لك بالتحقق بسرعة من وجود إدخال وأيضًا تخزين الطلبات، يبدو أن هذه المجموعة مناسبة تمامًا لإزالة التكرارات من القائمة. أو، على سبيل المثال، حل مشاكل مثل آخر عنصر رأيته مؤخرًا في حقيبتي. أو هل تتذكر لعبة مثل Pokemon Go؟ يمكن لـ LinkedHashSet تخزين قائمة بالبوكيمونات التي واجهتها والترتيب الذي صادفتهم به في طريقك. في هذه الحالة، لن يتم إضافة البوكيمون "المتكرر" إلى القائمة. أو على سبيل المثال، قائمة الزعماء حسب المستوى الذين قابلتهم بالفعل في أي لعبة ذات مستويات. أو تاريخ اكتشاف الأجسام الكونية. يتيح لك LinkedHashSet التحقق بسرعة مما إذا كان الجسم الفضائي موجود بالفعل في القائمة أم لا، وإذا لم يكن موجودًا، فقم بإضافته إلى القائمة. لنأخذ مثالاً على إزالة التكرارات.
import java.util.*;
class LinkedHashSetExample2 {
public static void main(String[] args) {
List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");
Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);
// next will print:
// > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
System.out.println("listWithDuplicates = " + listWithDuplicates);
// next will print:
// > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);
// -------------------------------------------------------------------------
// while using regular Hash Set will generally produces some unexpected order
Set<String> regularHashSet = new HashSet<>(listWithDuplicates);
// next will print:
// > linkedHashSet = [some, elements, with, few, duplicates, were, here]
System.out.println("linkedHashSet = " + linkedHashSet);
// next will print:
// > regularHashSet = [here, some, with, duplicates, were, elements, few]
System.out.println("regularHashSet = " + regularHashSet);
}
}
مخرجات البرنامج هنا :
GO TO FULL VERSION