آموزش جاوا

آموزش کلکسیون ها در جاوا- درس سوم: آشنایی با متدهای کاربردی کلاس Collections

یک یادآوری خیلی مهم:

لطفاً کلاس Collections جاوا را با واسط Collection اشتباه نگیرید!

اگر تفاوت این دوتا را یادتان نیست، یا دقیقاً به خاطر ندارید کدامشان کجای قصه بود، چهار دقیقه وقت بگذارید و این مطلب را بخوانید: کلکسیون ها در جاوا- درس اول: آشنایی با کلکسیون ها (Java Collections)

متدهای کلاس Collections

کلاس Collections مستقیما از کلاس Object جاوا ارث بری می کنه. این کلاس ساخته شده تا بوسیله متدهای خفنی که داره، کار با کلکسیون ها رو برای ما دلپذیرتر کنه.

کلاس Collections جاوا حدود ۶۰ تا متد داره. از این متدها، چندتاشون فقط روی List کار می کنه. ولی بقیه شون روی تمام انواع مختلف کلکسیون ها کار میکنه.

من فکر نمیکنم همه ۶۰ تاشو فرصت کنم اینجا توضیح بدم. اما متدهای پرکاربردشون توضیح میدم، و برای بقیه اش هم لینک های مفیدی براتون میذارم که برید و هر کدوم رو که خواستید ته و توشو دربیارید.

متدهای کلاس Collections که مختص List هستن

اول این ممتدها رو توی جدول زیر ببینید و یه آشنایی مختصر باهاشون پیدا کنید. بعدش میریم و دونه دونه توضیحشون میدیم.

کاربرد متدنام متد
لیست رو مرتب می کنهsort
از الگوریتم جستجوی باینری برای جستجو در لیست استفاده می کنهbinarySearch
لیست رو برعکس میکنهreverse
ترتیب لیست رو بهم میریزه و اونو بصورت تصادفی می چینه. (هم میزنه!)shuffle
کل لیست رو با یک شئ یکسان پر میکنه fill
اشیاء یک لیست رو توی یک لیست دیگه کپی میکنه copy
جدول متدهای کلاس Collections جاوا برای کار با لیست ها

متد sort کلاس Collections جاوا

این متد، یک لیست رو مرتب می کنه. اگه یادتون باشه ما گفتیم که کلکسیون ها فقط نوع مرجع داخل خودشان نگه می دارن. یعنی فقط اشیاء رو داخلشون نگه میدارن و مقادیر رو نمی تونن نگه دارن.

متد sort در حالت عادی یک لیست میگیره و اون رو بر اساس ترتیب پیشفرض، مرتب می کنه.

مثلا ترتیب پیشفرض برای لیست های نوع String، ترتیب حروف الفباست. و برای لیست های از نوع Integer به ترتیب عددی صعودی هستش.

برای مرتب سازی لیست هایی از نوع اشیائی که ترتیب طبیعی اونها معلوم نیست (مثلا اشيائی از جنس Person) باید واسط Comparable در اون اشیاء پیاده سازی بشه.

این مورد رو کامل در مطلب مربوط به واسط Comparable و کلاس Comparator توضیح خواهم داد.

الا اگه یخورده مبحث سنگین شد و گیج شدین، فعلا یه مثال از sort یک لیست از نوع String ببینید:‌

حالت اول: مرتب سازی لیست String به ترتیب صعودی:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Sort1 {
    public static void main(String[] args) {
        String[] names = {"Mahmood", "Asghar", "Taghi", "Bahram"};

        List<String> list = Arrays.asList(names);
        System.out.println(list);
        Collections.sort(list);
        System.out.printf("%nSorted List: %s%n", list);
    }
}

خروجی کد:

[Mahmood, Asghar, Taghi, Bahram]

Sorted List: [Asghar, Bahram, Mahmood, Taghi]

Process finished with exit code 0

توضیح کد:

  • خط ۷ : ما یک آرایه از نوع Stering درست کردیم و اسم چهارنفر رو ریختیم توش.
  • حط ۸: ما یه لیست جنریک از نوع String درست کردیم. بعدش از متد asList آرایه ها استفاده کردیم که با آرایه مثل یه لیست رفتار بکنه. بعد اون آرایه رو ریختیم توی لیستی که درست کرده بودیم.
  • خط ۹: یه بار خود لیست رو چاپ کردیم که ببینیم در حالت مرتب نشده چجوری نمایش داده میشه.
  • خط۱۰: از متد استاتیک sort که داخل کلاس Collections قرار داره، استفاده کردیم. لیستمون رو بعنوان آرگومان ورودی دادیم به این متد، که برامون مرتبش کنه.
  • خط ۱۱: لیست مرتب شده رو چاپ کردیم که از نتیجه کار مطمئن بشیم.

حالت دوم: مرتب سازی لیست String به ترتیب نزولی:

در این حالت، ما علاوه بر اینکه لیست را بعنوان آرگومان ورودی به متد sort میدیم، متد استاتیک reverseOrder از کلاس Collections رو هم بعنوان آرگومان دوم بهش میدیم. با این کار متد sort، مرتب سازی رو بر اساس آرگومان دوم انجام میده.

برای مرتب کردن لیست هایی از اشیائ دلخواه، یا مرتب کردن لیست ها به ترتیب دلخواه، ما اول نحوه مرتب کردن رو توی یک شئ Comparator تعریف می کنیم و اون رو بعنوان آرگومان دوم به متد sort میدیم. متد sort هم بعنوان دستورالعمل مرتب سازی از اون شئ Comparatorاستفاده میکنه و لیست رو بر اون اساس مرتب میکنه.

حالا البته در مثال زیر ما از متد آماده ی reverseOrder کلاس Collections بعنوان پارامتر دوم متد sort استفاده می کنیم. که مرتب سازی رو بر اساس ترتیب تزولی انجام بده.

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Sort1 {
    public static void main(String[] args) {
        String[] names = {"Mahmood", "Asghar", "Taghi", "Bahram"};

        List<String> list = Arrays.asList(names);
        System.out.println(list);
        Collections.sort(list, Collections.reverseOrder());
        System.out.printf("%nSorted List: %s%n", list);
    }
}

خروجی کد:

[Mahmood, Asghar, Taghi, Bahram]

Sorted List: [Taghi, Asghar, Bahram, Mahmood]

Process finished with exit code 0

توضیح کد:

  • خط ۷ : ما یک آرایه از نوع Stering درست کردیم و اسم چهارنفر رو ریختیم توش.
  • حط ۸: ما یه لیست جنریک از نوع String درست کردیم. بعدش از متد asList آرایه ها استفاده کردیم که با آرایه مثل یه لیست رفتار بکنه. بعد اون آرایه رو ریختیم توی لیستی که درست کرده بودیم.
  • خط ۹: یه بار خود لیست رو چاپ کردیم که ببینیم در حالت مرتب نشده چجوری نمایش داده میشه.
  • خط۱۰: از متد استاتیک sort که داخل کلاس Collections قرار داره، استفاده کردیم. لیستمون رو بعنوان اولین آرگومان ورودی دادیم به این متد. و متد Collections.reverseOrder رو هم بعنوان آرگومان دوم دادیم به متد sort که برامونبه ترتیب نزولی مرتبش کنه.
  • خط ۱۱: لیست مرتب شده رو چاپ کردیم که از نتیجه کار مطمئن بشیم.

متد reverse کلاس Collections جاوا

متد reverseلیست رو برعکس می کنه. فرقش با اینکه توی sort، متد reverseOrder رو وارد کنیم اینه که اونجوری لیست مرتب میشه و بعد برعکس میشه. در حالی که استفاده از reverse باعث میشه لیست همونجوری که هست و مرتب نشده، برعکس بشه. این مثال رو ببینید:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Sort1 {
    public static void main(String[] args) {
        String[] names = {"Mahmood", "Asghar", "Taghi", "Bahram"};

        List<String> list = Arrays.asList(names);
        System.out.println(list);
        Collections.reverse(list);
        System.out.printf("%nReversed List: %s%n", list);
    }
}

خروجی کد:

[Mahmood, Asghar, Taghi, Bahram]

Reversed List: [Bahram, Taghi, Asghar, Mahmood]

Process finished with exit code 0

همانطور که می بینید، لیست ما پس از اجرای متد Collections.reverse برعکس شده است.

متد shuffle از کلاس Collections جاوا

متد shuffle ترتیب آیتم های لیست رو به صورت تصادفی بهم میریزه.

نحوه استفاده از متد shuffleرو در مثال زیر ببینید:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Sort1 {
    public static void main(String[] args) {
        String[] names = {"Mahmood", "Asghar", "Taghi", "Bahram"};

        List<String> list = Arrays.asList(names);
        System.out.println(list);
        Collections.shuffle(list);
        System.out.printf("%nShuffled List: %s%n", list);
    }
}

خروجی کد:

[Mahmood, Asghar, Taghi, Bahram]

Shuffled List: [Taghi, Asghar, Bahram, Mahmood]

Process finished with exit code 0

توضیح کد:

  • خط ۷ : ما یک آرایه از نوع Stering درست کردیم و اسم چهارنفر رو ریختیم توش.
  • حط ۸: ما یه لیست جنریک از نوع String درست کردیم. بعدش از متد asList آرایه ها استفاده کردیم که با آرایه مثل یه لیست رفتار بکنه. بعد اون آرایه رو ریختیم توی لیستی که درست کرده بودیم.
  • خط ۹: یه بار خود لیست رو چاپ کردیم که ببینیم در حالت مرتب نشده چجوری نمایش داده میشه.
  • خط۱۰: از متد استاتیک suffle که داخل کلاس Collections قرار داره، استفاده کردیم. لیستمون رو بعنوان آرگومان ورودی دادیم به این متد. اون بی تربیت هم لیست ما رو بهم ریخت!
  • خط ۱۱: لیست بهم ریخته رو چاپ کردیم که از نتیجه کار مطمئن بشیم.

متد fill از کلاس Collections جاوا

این متد تمام اعضای یک لیست رو با یک شئ یکسان پر میکنه. این کار معمولا به درد آماده سازی و مقداردهی اولیه یک لیست جدید میخوره.

در مثال زیر، همون لیست خودمون رو با عبارت salam پر کردیم.

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Sort1 {
    public static void main(String[] args) {
        String[] names = {"Mahmood", "Asghar", "Taghi", "Bahram"};

        List<String> list = Arrays.asList(names);
        System.out.println(list);
        Collections.fill(list, "salam");
        System.out.printf("%nFilled List: %s%n", list);
    }
}

خروجی کد:

[Mahmood, Asghar, Taghi, Bahram]

Filled List: [salam, salam, salam, salam]

Process finished with exit code 0

متد Copy از کلاس Collections جاوا

متد کپی، دو آرگومان می گیره. که اولی لیست مقصد و دومی لیست مبدا هستش. و میاد اعضای لیست مبدا رو توی لیست مقصد کپی می کنه.

فقط باید حواستون باشه که دوتاا لیست مبدا و مقصد باید تعداد اعضاشون باهم برابر باشه و از یه نوع لیست باشن. وگرنه کامپایلر بهتون خطا بر می گردونه.

این مثال رو ببینید:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

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

        List<String> list = new ArrayList<>();
        list.add("asghar");
        list.add("bahram");
        list.add("taghi");
        list.add("mahmood");
        String[] s1 = new String[4];
        List<String> listCopy = Arrays.asList(s1);
        Collections.fill(listCopy , "salam");
        System.out.println(list);
        Collections.copy(listCopy , list);
        System.out.printf("%nCopied List: %s%n", listCopy);
    }
}

خروجی کد:

[asghar, bahram, taghi, mahmood]

Copied List: [asghar, bahram, taghi, mahmood]

Process finished with exit code 0

متد های کلاس Collections که علاوه بر لیست، در سایر کلکسیونها نیز کاربرد دارند

توضیحمتد
کوچکترین عنصر کلکسیون را بر می گرداند min
بزرگترنی عنصر کلکسیون را بر می گرداند max
تمامی اعضای یک آرایه را به کلکسیون اضافه می کندaddAll
فراوانی عنصر مشخص شده در یک کلکسیون را مشخص می کند. frequency
تعیین می کنه که آیا دو کلکسیون باهم عنصر مشترک دارند یا نه disjoint

منابع مفید جهت آشنایی بیشتر با متد های کلاس Collections جاوا

کلاس Collections حدود ۶۰ متد داره که توضیح دادنشون کار یک نفر و دو نفر و یک شب و دو شب نیست!

بنابر این من در این مطلب کاربردیهاشو براتون توضیح دادم و مثال زدم. بقیه اش رو می تونین در منابع زیر پیدا کنین و ازشون استفاده کنین.

در مورد هر کدوم هم سوال داشتین، ازم بپرسین. حتما جواب میدم.

منبع شماره یک: سایت javaTpoint

منبع شماره دو: سایت tutorialspoint.com

برچسب ها

حامد عسکریان

برنامه نویس و عاشق تکنولوژی

دیدگاهتان را بنویسید

دکمه بازگشت به بالا
بستن
بستن