CodeGym /مدونة جافا /Random-AR /LinkedHashSet في جافا
John Squirrels
مستوى
San Francisco

LinkedHashSet في جافا

نشرت في المجموعة
عند الحديث عن فئة LinkedHashSet في Java، يجب أن نذكر أنها تنفذ واجهة Set . يقوم LinkedHashSet بإنشاء مجموعة تخزن العناصر في جدول التجزئة ولكنها تحافظ على ترتيب إدراج العناصر على عكس نظيرتها HashSet .

ما هو محدد في جافا

دعونا نتذكر بإيجاز أن واجهة 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() يُرجع عدد العناصر في هذه المجموعة (عدد عناصرها).

أمثلة سهلة لـ LinkedHashSet في المثال أدناه، نعرض تهيئة كائن LinkedHashSet واستخدام طريقة add() لملء المجموعة.

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);
       }
   }
الإخراج هو:
[إعادة، دو، فا، سول، لا، تي، مي]
كما ترون، ظهرت العناصر في مجموعتنا بنفس الترتيب الذي وضعناها فيه. LinkedHashSet في جافا - 1

مثال 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);
       }
   }
مخرجات البرنامج هنا :
[إعادة، دو، فا، سول، لا، تي، مي]
إن مخرجات المثال الثاني هي نفسها تمامًا كما في المثال الأول. لا يمكن أن يكون لدينا عنصرين متشابهين في مجموعة LinkedHashSet . عندما نحاول وضع الثانية، يتم تجاهلها.

مثال 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);
       }
   }
مخرجات البرنامج هنا :
[Re, Do, Fa, Sol, La, Ti, Mi] false اطبع مجموعتنا دون إزالة العناصر: [Re, Do, Sol, La, Ti, Mi] اطبع مجموعتنا بعد أمر واضح: []
كما ترون، فإن طريقة الإزالة () المطبقة على عنصر غير موجود لا تؤدي إلى خطأ في البرنامج. إنه ببساطة يُرجع خطأ إذا لم تتم إزالة العنصر وصحيحًا إذا كان العنصر موجودًا في LinkedHashSet ثم تمت إزالته.

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);
   }
}
مخرجات البرنامج هي :
RegularHashSet = [65536, 3, 5, 7, 9] LinkedHashSet = [7, 3, 5, 65536, 9]

استخدام 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);
   }
}
مخرجات البرنامج هنا :
listWithDuplicates = [بعض العناصر، مع، قليل، مكررة، كانت، هنا، مكررة، مكررة] listWithoutDuplicates = [بعض، العناصر، مع، قليل، مكررة، كانت، هنا] LinkHashSet = [بعض، العناصر، مع، قليل، مكررة ، كانت، هنا] RegularHashSet = [هنا، بعض، مع، نسخ مكررة، كانت، عناصر، قليلة]
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION