JavaRush /مدونة جافا /Random-AR /المجموعات في جافا | مجموعات جافا

المجموعات في جافا | مجموعات جافا

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

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

"المجموعات" هي اسم عام للعديد من بنيات البيانات في Java. يمكن تخزين البيانات بعدة طرق مختلفة. لقد قمنا حتى الآن بدراسة فئة ArrayList فقط ، حيث يتم تخزين البيانات في مصفوفة. وسنتعرف على بقية المجموعات لاحقاً. الآن يكفي أن نفهم أن فئة المجموعات مصممة للعمل ليس فقط مع ArrayList، ولكن أيضًا مع أنواع أخرى من المجموعات في Java (وبالتالي اسمها في الواقع). إذًا، ما هي المهام التي تسمح لك فئة Collections بحلها عند العمل مع ArrayList؟ الأول والأكثر وضوحًا هو الفرز. في محاضرة المصفوفات، نظرنا إلى مثال بالأرقام، والآن دعونا نلقي نظرة على مثال بالسلاسل. لفرز محتويات المجموعات، تطبق فئة المجموعات الطريقة التالية 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> lottery = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

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

       Collections.shuffle(lottery);//mix
       System.out.println("Attention! The first 10 numbers appear from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(lottery.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
   }
}

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
	at 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));// wrong planet order
       System.out.println(solarSystem);

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

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

[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
وأخيرا، دعونا نتعرف على طريقة مثيرة للاهتمام للغاية - disjoint(). يتحقق مما إذا كانت هناك تقاطعات بين مجموعتين، أي عنصر متطابق واحد على الأقل. إذا لم يكن الأمر كذلك، يتم إرجاعه true، إذا كانت الإجابة بنعم، يتم إرجاعه false.
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