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

فئة المجموعات في جافا

نشرت في المجموعة
أهلاً! في الدروس القليلة الماضية، أحرزنا تقدمًا كبيرًا في إتقاننا لـ ArrayList. ومع ذلك، فقد قمنا حتى الآن بإجراء أبسط العمليات فقط: الإزالة والإدراج والعرض. بالطبع، هذا لا يغطي القائمة الكاملة للمهام التي يجب على المطورين تنفيذها عند العمل مع ArrayList. هل تتذكر الدرس حول المصفوفات والفصل Arrays؟ صمم منشئو Java هذا الفصل خصيصًا للتعامل مع المهام الأكثر شيوعًا التي يواجهها المبرمجون عند العمل مع المصفوفات. وماذا عن ArrayList؟ بالتأكيد، هناك قائمة من المهام الشائعة التي يجب تنفيذها باستخدامها. هل تم تنفيذها جميعًا في فصل معين أم أنه يتعين علينا كتابة التنفيذ الخاص بنا في كل مرة؟ بالطبع، ليس من الضروري أن تكتب كل شيء بنفسك. تم بالفعل تنفيذ العمليات الأكثر شيوعًا التي تتضمن المجموعات في Collectionsفئة ثابتة خاصة. فئة المجموعات - 1 في Java، يُشار إلى مجموعة من هياكل البيانات عادةً على أنها مجموعة . يمكن تخزين البيانات بعدة طرق مختلفة. حتى الآن، قمنا فقط بدراسة الفصل ArrayListالذي يتم فيه تخزين البيانات في مصفوفة. وسنتعرف على مجموعات أخرى لاحقا. في الوقت الحالي، يكفي أن نفهم أن الفصل Collectionsمصمم للعمل ليس فقط مع ArrayList، ولكن أيضًا مع أنواع أخرى من المجموعات (ومن هنا جاء اسمه). إذًا، ما هي المهام التي Collectionsيساعدها الفصل فعليًا عند العمل بها ArrayList؟ الأول والأكثر وضوحًا هو الفرز. في درس المصفوفات، تناولنا مثالًا بالأرقام. الآن سننظر في مثال مع السلاسل. Collectionsيطبق الفصل طريقة sort()فرز محتويات المجموعات:

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
الإخراج: [الأرض، المشتري، المريخ، عطارد، نبتون، زحل، أورانوس، الزهرة] يتم فرز السلاسل أبجديًا! ولكن لماذا أبجديا؟ يطبق الفصل Stringبالفعل المنطق الذي يحكم كيفية مقارنة السلاسل (والذي يصادف أنه أبجديًا). بالنسبة للفصول الدراسية التي تقوم بإنشائها بنفسك، يمكنك تنفيذ منطق المقارنة الخاص بك، لكننا سنتحدث عن ذلك في دروس أخرى. Collectionsيساعدك الفصل أيضًا في العثور على الحد الأدنى والحد الأقصى للعنصر في ملف ArrayList. ويتم ذلك باستخدام الطرق min()والطرق max():

public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
الإخراج: 7 1 بطبيعة الحال، يعد هذا أكثر ملاءمة بكثير من كتابة التعليمات البرمجية يدويًا للتكرار على جميع العناصر والعثور على أكبر/أصغر عنصر :) هناك طريقة أخرى مفيدة جدًا وهي reverse(). إذا اضطررنا إلى "قلب" القائمة بحيث تسير العناصر بالترتيب المعاكس، فكيف نفعل ذلك؟ ربما لن يكون من السهل كتابة مثل هذه الخوارزمية بنفسك :) لحسن الحظ، الطريقة reverse()تعرف كيف تفعل ذلك بالفعل. لنفترض أننا لا نحب حقيقة أن sort()الطريقة صنفت كواكبنا أبجديًا، ونريد عكس ترتيبها: من Z إلى A:

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
النتيجة: [الزهرة، أورانوس، زحل، نبتون، عطارد، المريخ، المشتري، الأرض] لقد كنا نتحدث كثيرًا عن الفرز، وترتيب العناصر، وما إلى ذلك. ولكن ماذا لو كان لدينا الهدف المعاكس؟ على سبيل المثال، لنفترض أننا نحاول تنفيذ لعبة بينغو. نضيف 100 رقم إلى الطبلة. يجب أن تظهر على الشاشة واحدة تلو الأخرى. أول لاعب يشطب جميع الأرقام الموجودة على تذكرته هو الفائز. من السهل تنفيذ ذلك باستخدام shuffle()الطريقة:

public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> bingoDrum = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           bingoDrum.add(i);// add the numbers 1 to 100 to the drum
       }

       Collections.shuffle(bingoDrum);// Mix it up
       System.out.println ("Your attention, please! Here are the first 10 numbers from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(bingoDrum.get(i));
       }

   }
}
الإخراج: انتباهكم، من فضلك! هنا أول 10 أرقام من الطبلة! 32 61 4 81 25 8 66 35 42 71 الأمر بهذه السهولة! تم حل المشكلة، وتم كتابة الجزء الخاص بنا من اللعبة :) الآن دعونا نتخيل موقفًا مختلفًا. في السابق، قمنا بإنشاء solarSystemقائمة تحتوي على الكواكب. ويبدو أنه يناسبنا من كل النواحي ماعدا طريقة واحدة: يمكنك حذف عناصر منه وإضافة عناصر جديدة ! من الواضح أن هذا ليس السلوك الذي نتوقعه: يجب أن يكون النظام الشمسي غير قابل للتغيير في برنامجنا. يحتوي الفصل Collectionsعلى طريقة مثيرة جدًا للاهتمام: unmodifiableList(). يقوم بإنشاء قائمة غير قابلة للتغيير من القائمة التي تم تمريرها كوسيطة. لا يمكنك إضافة أو حذف عناصر من هذه القائمة. عند التعامل مع قائمة الكواكب في المجموعة الشمسية، فهذا بالضبط ما نريده!

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Pluto");// Try to add a new element
   }
}
الإخراج: استثناء في مؤشر الترابط "الرئيسي" java.lang.UnsupportedOperationException في java.util.Collections$UnmodifiableCollection.add(Collections.java:1075) في Main.main(Main.java:21) هذا خطأ: لا يمكنك إضافة أي شيء إلى solarSystem! الشيء الوحيد الذي عليك الانتباه إليه هنا هو حقيقة أن هذه الطريقة تُرجع List<>(وليس ArrayList<>)، نظرًا لأن هذا النوع شائع في جميع أنواع القوائم. هناك موقف آخر شائع جدًا يمكن أن يحدث بسهولة وهو أن يقوم المبرمج بإضافة عناصر بترتيب خاطئ. فإذا حدث ذلك ووجدنا أن عطارد ونبتون مختلطان فيمكننا تصحيح هذا الخطأ بالطريقة التالية swap():

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// The planets are in the wrong order
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
نمرر إلى swap()الطريقة قائمتنا ومؤشرات العنصرين اللذين يجب تبديلهما. لاحظ أن الطريقة تعمل مع المؤشرات وليس المراجع. لذا، كان علينا هنا استخدام ArrayList.indexOf()الطريقة. الإخراج: [نبتون، الزهرة، الأرض، المريخ، المشتري، زحل، أورانوس، عطارد] [عطارد، الزهرة، الأرض، المريخ، المشتري، زحل، أورانوس، نبتون] أخيرًا، سنتعرف على طريقة مثيرة جدًا للاهتمام : disjoint(). يتحقق مما إذا كانت مجموعتان تتقاطعان، أي ما إذا كان لديهما عنصر متطابق واحد على الأقل . إذا لم يفعلوا ذلك، فإنه يعود صحيحا. إذا فعلوا ذلك، فإنه يعود كاذبا

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
كما ترون، تحتوي القائمتان لدينا على عناصر مختلفة تمامًا، لذا فإن البرنامج يخرج true . هذه فئة مثيرة للاهتمام ومفيدة للغاية. مثلًا Arrays، فهو يقوم بالكثير من العمل الروتيني والمضجر بالنسبة لنا، مما يسمح لنا بالتركيز على أشياء أخرى.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION