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

مجموعة جافا

نشرت في المجموعة
Set عبارة عن واجهة في Java Collection Framework. يمكنك استخدام Java Set لتنفيذ مجموعات غير مرتبة بعناصر فريدة. في هذه المقالة، سنلقي نظرة على هذه الواجهة وتطبيقاتها في لغة جافا، وطرق العمل مع مجموعة، ونقدم أيضًا بعض الأمثلة.

ما هي مجموعة جافا

Set عبارة عن واجهة من Java Collection Framework، لكن Set ليست مجموعة مرتبة، على عكس List . وهذا يعني أنه يتم الاحتفاظ بعناصر Java Set دون ترتيب معين. لذلك لا يوجد تحكم في الموضع الذي يمكنك من خلاله إدراج عنصر. كما لا يمكنك الوصول إلى العناصر من خلال فهرسها. رياضياً، المجموعة عبارة عن مجموعة من العناصر الفريدة. في الواقع، هذه مجموعة غير مرتبة (مجموعة غير مرتبة)، حيث لا يمكن تخزين العناصر المتطابقة. إذا قمت عن قصد بإضافة عنصر مكرر إلى مجموعة ، فسيتم تجاهل هذا الإجراء ولن تتغير المجموعة . ومع ذلك يجوز تخزين عنصر واحد فارغ فيه.

تعيين عمليات التنفيذ

Java Set عبارة عن واجهة، لذا تحتاج إلى استخدام أحد تطبيقاتها لإنشاء كائنات. هذه هي HashSet و TreeSet و LinkedHashSet . في Set s، يتم تخزين كل عنصر في مثيل واحد فقط، وتستخدم التطبيقات المختلفة لـ Set ترتيبًا مختلفًا لتخزين العناصر. في HashSet ، يتم تحديد ترتيب العناصر من خلال خوارزمية معقدة. إذا كان ترتيب التخزين مهمًا بالنسبة لك، فاستخدم حاوية TreeSet ، التي تخزن الكائنات مرتبة بترتيب تصاعدي بترتيب المقارنة، أو LinkedHashSet ، الذي يخزن العناصر بترتيب إضافي. غالبًا ما تُستخدم المجموعات لاختبار العضوية بحيث يمكنك بسهولة التحقق مما إذا كان الكائن ينتمي إلى مجموعة معينة، لذلك يتم عادةً اختيار تطبيق HashSet المُحسّن للبحث السريع. HashSet عبارة عن مجموعة تستخدم قيم التجزئة الخاصة بها والتي يتم إرجاعها بواسطة طريقة hashCode () لتخزين العناصر داخليًا. أي أنه داخل HashSet<E> ، يتم تخزين كائن HashMap<E, Object> ، الذي يخزن قيم HashSet كمفاتيح. يتيح لك استخدام رموز التجزئة إمكانية البحث بسرعة عن العناصر وإضافتها وإزالتها من المجموعة . LinkedHashSet عبارة عن HashSet تقوم أيضًا بتخزين العناصر في قائمة مرتبطة. لا تحافظ HashSet العادية على ترتيب العناصر. أولاً، إنه ببساطة غير موجود رسميًا، وثانيًا، حتى النظام الداخلي يمكن أن يتغير بشكل كبير عند إضافة عنصر واحد فقط. ويمكنك الحصول على مكرر من LinkedHashSet واستخدامه لتصفح جميع العناصر بالترتيب الدقيق الذي تمت إضافتها به إلى LinkedHashSet . ليس في كثير من الأحيان، ولكن في بعض الأحيان يمكن أن يكون ضروريا للغاية. TreeSet عبارة عن مجموعة تقوم بتخزين العناصر كشجرة مرتبة حسب القيمة. داخل TreeSet<E> يوجد TreeMap<E, Object> الذي يخزن كل هذه القيم. ويستخدم TreeMap شجرة ثنائية متوازنة باللونين الأحمر والأسود لتخزين العناصر. لذلك، فهي تحتوي على عمليات add() و remove() سريعة جدًا وتحتوي على() .

إنشاء كائن مجموعة

لإنشاء كائن مجموعة، يمكنك استخدام أحد النماذج التالية:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
فيما يلي مثال بسيط، حيث نقوم بإنشاء مجموعتين ، HashSet و LinkedHashSet ، ونضيف إلى كل منهما 5 عناصر. يمكننا استخدام طريقة add () لهذا الغرض.
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
هنا هو إخراج البرنامج:
[أليكس، إيجور، ستيوارت، جوني، بيل] [ستيوارت، أليكس، جوني، إيجور، بيل]
كما ذكرنا أعلاه، فإن HashSet لا يحافظ على ترتيب العناصر، لكن LinkedHashSet يفعل ذلك. لقد كان LinkedHashSet هو الذي أعطانا العناصر بالترتيب الذي كتبناها في المجموعة.

طرق تعيين جافا

فيما يلي بعض الطرق المهمة لمجموعة Java:
  • إضافة منطقية (E e) . يضيف العنصر المحدد إلى المجموعة إذا لم يكن موجودًا بالفعل (عملية اختيارية).

  • إزالة منطقية (كائن س) . إزالة العنصر المحدد من هذه المجموعة إذا كان موجودًا (عملية اختيارية).

  • منطقية RemoveAll(Collection c) . يزيل من هذه المجموعة جميع عناصرها الموجودة في المجموعة المحددة (عملية اختيارية).

  • منطقية تحتفظ بالكل (المجموعة ج) . يحتفظ فقط بالعناصر الموجودة في هذه المجموعة والمضمنة في المجموعة المحددة (عملية اختيارية).

  • باطل واضح () . يزيل كافة العناصر من المجموعة.

  • مكرر مكرر () . إرجاع مكرر على العناصر الموجودة في هذه المجموعة.

  • حجم صحيح () . يتم استخدامه للحصول على عدد العناصر في المجموعة.

  • منطقية فارغة () . للتحقق مما إذا كانت Set فارغة أم لا.

  • منطقي يحتوي على (Object o) . يُرجع صحيحًا إذا كانت هذه المجموعة تحتوي على العنصر المحدد.

  • مكرر مكرر () . إرجاع مكرر على العناصر الموجودة في هذه المجموعة. يتم إرجاع العناصر بدون ترتيب معين.

  • الكائن[] toArray() . تقوم بإرجاع مصفوفة تحتوي على كافة العناصر الموجودة في هذه المجموعة. إذا قدمت هذه المجموعة أي ضمانات فيما يتعلق بترتيب إرجاع عناصرها بواسطة مكررها، فيجب أن تقوم هذه الطريقة بإرجاع العناصر بنفس الترتيب.

تشبه الأساليب تلك الموجودة في ArrayList ، باستثناء أن الأسلوب add(Object o) يضيف كائنًا إلى المجموعة فقط إذا لم يكن موجودًا بالفعل. تكون القيمة المرجعة للطريقة صحيحة إذا تمت إضافة الكائن، وتكون خاطئة بخلاف ذلك. هناك أيضًا بعض الطرق الموروثة من Collection<> Interface: ParallelStream() و removeIf() و stream() و forEach() الأسلوب الموروثة من java.lang.Iterable Interface.

مجموعة جافا مثال على العمليات الرئيسية

في هذا المثال، نقوم بإنشاء مصفوفة من السلاسل ثم تمريرها إلى mySet باستخدام عملية Arrays.asList . ثم نزيل عنصرين آخرين ونضيف عنصرين آخرين. في هذه الحالة، أحد العناصر الموجودة في المجموعة موجود بالفعل: لن تتم إضافته. سنحاول أيضًا تجربة عمليات التحقق من الفراغ isEmpty() وتحديد حجم المجموعة size() ومسح المجموعة من جميع العناصر Clear() .
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
مخرجات البرنامج هنا :
[أليكس، إيجور، ستيوارت، تانيا، جوني، آيفي] [أليكس، تانيا، جوني، آيفي] [أليكس، داشا، تانيا، جوني، آيفي] كمية عناصر المجموعة = 5 هل mySet فارغة؟ خطأ هل ايجور في المجموعة؟ خطأ هل جوني في المجموعة؟ صحيح هل mySet فارغ الآن؟ حقيقي

مثال مع LinkedHashSet وتعيينه على Array

دعونا نكتب برنامج آخر. في ذلك، سنقوم بإنشاء مجموعة بناءً على LinkedHashSet ، وإضافة عناصر إليها، ثم تحويل المجموعة إلى مصفوفة.
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
هنا هو إخراج البرنامج:
[C, D, E, F, G, A, B] false اطبع مجموعتنا مع إزالة العناصر: [C, D, E, G, A, B] مصفوفة جديدة من المجموعة: [C, D, E, G, أ، ب] ج

ضع مثالاً مع المكرر

لنقم بإنشاء مجموعة، ثم طباعتها باستخدام مكرر، ثم إزالة جميع الأرقام الزوجية منها، باستخدام مكرر أيضًا.
import java.util.*;

public class SetTest5
{
   public static void main(String[] args)
   {

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
مخرجات البرنامج هنا :
[0، 1، 2، 3، 4، 5، 6، 7، 8، 9] [1، 3، 5، 7، 9]

مثال مع TreeSet

إذا كان الفرز مهمًا بالنسبة لك، فاستخدم تطبيق TreeSet . في هذا المثال القصير سنقوم بملء المجموعة بأسماء الأصدقاء كما في الأمثلة السابقة. ومع ذلك، في TreeSet التي تم فرزها ، ستتم كتابة العناصر على الفور بترتيب مفروز. وفي هذه الحالة، سيتم عرض الأسماء أبجديًا.
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
الإخراج هو:
[أليكس، بيل، إيجور، جوني، ستيوارت]

استنتاجات موجزة

  • تعد واجهة Java Set جزءًا من Java Collections Framework.

  • الفئات المنفذة: AbstractSet ، ConcurrentHashMap.KeySetView ، ConcurrentSkipListSet ، CopyOnWriteArraySet ، EnumSet ، HashSet ، JobStateReasons ، LinkedHashSet ، TreeSet .

  • أشهر تطبيقات Set هي HashSet و LinkedHashSet و TreeSet .

  • يتم تحديد ترتيب عناصر HashSet بواسطة خوارزمية معقدة. إذا كان ترتيب التخزين مهمًا بالنسبة لك، فاستخدم حاوية TreeSet ، التي تخزن الكائنات مرتبة بترتيب تصاعدي بترتيب المقارنة، أو LinkedHashSet ، الذي يخزن العناصر بترتيب إضافي.

  • في أغلب الأحيان، يتم استخدام المجموعات لاختبار العضوية. وهذا يعني التحقق مما إذا كان الكائن ينتمي إلى مجموعة معينة بالمعنى الرياضي. لذلك، في أغلب الأحيان يتم اختيار HashSet في أغلب الأحيان في الممارسة العملية . تم تحسين هذا التنفيذ للبحث السريع.

  • لا يمكنك إضافة عناصر مكررة إلى مجموعة، لذا يمكنك استخدام تطبيقات واجهة المجموعة لتخزين العناصر الفريدة.

  • يتيح لك Set إضافة عنصر فارغ واحد فقط.

  • المجموعة ليست قائمة ولا تدعم الفهارس أو مواضع عناصرها.

تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION