CodeGym /وبلاگ جاوا /Random-FA /کلاس مجموعه ها در جاوا
John Squirrels
مرحله
San Francisco

کلاس مجموعه ها در جاوا

در گروه منتشر شد
سلام! در چند درس گذشته، ما پیشرفت زیادی در تسلط خود به ArrayList. با این حال، تا کنون ما فقط ساده ترین عملیات را انجام داده ایم: حذف، درج و نمایش. البته، این فهرست کامل وظایفی را که توسعه‌دهندگان باید هنگام کار با آن انجام دهند، شامل نمی‌شود ArrayList. درس مربوط به آرایه ها و Arraysکلاس را به خاطر دارید؟ سازندگان جاوا به طور خاص این کلاس را برای رسیدگی به رایج ترین وظایفی که برنامه نویسان هنگام کار با آرایه ها با آن مواجه می شوند طراحی کردند. و در مورد چی ArrayList؟ مطمئناً، فهرستی از کارهای رایجی وجود دارد که باید با آن انجام شود. آیا همه آنها در یک کلاس خاص پیاده سازی شده اند یا هر بار باید پیاده سازی خود را بنویسیم؟ البته لازم نیست همه چیز را خودتان بنویسید. متداول ترین عملیات مربوط به مجموعه ها قبلاً در Collectionsکلاس استاتیک ویژه پیاده سازی شده است. در جاوا، به گروهی از ساختارهای داده معمولاً مجموعه ایکلاس مجموعه - 1 گفته می شود . داده ها را می توان به روش های مختلف ذخیره کرد. تا اینجا ما فقط کلاسی را مطالعه کرده ایم که در آن داده ها در یک آرایه ذخیره می شوند. در ادامه با مجموعه های دیگر آشنا می شویم. در حال حاضر، فقط درک این نکته کافی است که کلاس برای کار نه تنها با ، بلکه با انواع دیگر مجموعه ها (از این رو، نام آن) طراحی شده است. بنابراین، کلاس واقعاً در هنگام کار با چه وظایفی کمک می کند ؟ اولین و واضح ترین آنها مرتب سازی است. در درس آرایه ها مثالی با اعداد در نظر گرفتیم. اکنون مثالی را با رشته ها در نظر می گیریم. کلاس متد را برای مرتب سازی محتویات مجموعه ها پیاده سازی می کند :ArrayListCollectionsArrayListCollectionsArrayListCollectionssort()
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
   }
}
خروجی: استثنا در رشته "main" 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(). بررسی می‌کند که آیا دو مجموعه با هم تلاقی می‌کنند، یعنی حداقل یک عنصر یکسان دارند یا خیر . اگر این کار را انجام ندهند، آن را درست برمی گرداند. این کار را انجام می دهند، سپس 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