JavaRush /وبلاگ جاوا /Random-FA /مجموعه ها در جاوا | مجموعه های جاوا

مجموعه ها در جاوا | مجموعه های جاوا

در گروه منتشر شد
سلام! در طول چند درس گذشته، ما پیشرفت زیادی در تسلط بر ArrayList داشته ایم. با این حال، در این مدت ما فقط ساده ترین عملیات را انجام دادیم: حذف، درج، خروجی به کنسول. البته این پایان لیست مشکلاتی نیست که توسعه دهندگان هنگام استفاده از ArrayList با آن مواجه می شوند . سخنرانی در مورد آرایه ها و کلاس Arrays را به خاطر دارید ؟ این برنامه توسط سازندگان جاوا به طور خاص برای حل مشکلات رایجی که برنامه نویسان هنگام کار با آرایه ها با آن مواجه می شوند، توسعه یافته است. در مورد ArrayList چطور ؟ مطمئناً لیستی از کارهای معمولی برای او نیز وجود دارد. آیا همه آنها در یک کلاس جداگانه پیاده سازی شدند یا هر بار باید رفتار مورد نظر را به صورت دستی بنویسیم؟ البته لازم نیست همه چیز را خودتان بنویسید. متداول ترین عملیاتی که هنگام استفاده از مجموعه ها در جاوا انجام می شود، قبلاً در یک کلاس استاتیک ویژه Collections پیاده سازی شده است. مجموعه های کلاس - 1

مجموعه ها در جاوا

"Collections" یک نام عمومی برای چندین ساختار داده در جاوا است. داده ها را می توان به روش های مختلف ذخیره کرد. تا کنون ما فقط کلاس 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> 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